Matlab умножает матрицу на отдельные части другой матрицы и получает диагональные элементы

Название этого поста может быть немного запутанным. Пожалуйста, позвольте мне предоставить немного контекста, а затем уточнить, о чем я спрашиваю. Для справки, вопрос, который я задаю, находится ближе к концу и обозначен жирными буквами. Я предоставляю некоторый код, обрисовывая в общих чертах, где я в настоящее время в решении проблемы, непосредственно заранее.

По сути, я пытаюсь сделать регрессию ядра, которая обычно выполняется с использованием одной контрольной точки. x и набор учебных экземпляров формула, Ссылку на это можно найти в википедии здесь. Я использую ядро ​​RBF, ссылку на Википедию для которого можно найти здесь.

Во всяком случае, у меня есть некоторый код, написанный на Matlab, так что это можно сделать быстро для одного экземпляра x, который 1 x p по размеру. То, что я хотел бы сделать, это сделать так, чтобы я мог очень быстро оценить множество пунктов, скажем, m x p,

Во избежание нотационных смешиваний я позволю обозначить обучающие примеры Train и случаи, когда я хочу оценки как Test: формула а также формула, Также необходимо отметить, что я хочу оценить вектор чисел для каждого из m точки. Для одной точки этот вектор будет 1 x v по размеру. Теперь мне нужно, чтобы это было m x v, Следовательно, Train также будет иметь вектор этих известных значений, называемых TS: формула, Наконец, нам нужен вектор сигм, который 1 x v по размеру. Это обозначается как Sig,

Вот код, который у меня есть:

 %First, we have to get the matrices to equivalent size so we can subtract Train from Test

 tm0 = kron(ones(size(Train,1),1),Test) - kron(ones(size(Test,1),1),Train);

 %Secondly, we apply the Euclidean norm sq by row and then multiply each of these results by each element (j) in Sig times 1/2j^2
 tm3 = exp(-kron(sum((tm0).^2,2),1/2./(Sig.^2)));

Теперь, в этот момент tm3 является (m*n) x v матрица. Вот где мой вопрос: теперь мне нужно умножить TS' (TS транспонировать) раз каждый из n x vсегменты в tm3 (имеются m из этих сегментов), получить диагональные элементы каждого из этих результирующих сегментов (после умножения одного из m сегменты будут v x vТаким образом, каждый кусок диагональных элементов будет 1 x v это означает, что полученная матрица m x v) и сложить эти диагональные элементы вместе, чтобы получить m x 1 размерная матрица. Наконец, мне нужно будет разделить каждую запись i в этом m x 1 матрица по каждому из v элементы в ith ряд диагонали-холдинга m x vматрица, производящая m x vматрица результатов.

Я надеюсь, что все это имеет смысл. Я уверен, что есть какой-то трюк, который можно использовать, но я просто не придумаю его. Любая помощь с благодарностью.

Изменить 1: меня попросили предоставить больше примера, чтобы помочь продемонстрировать, что я хотел бы сделать. Следующее представляет, что две матрицы, о которых я говорю, TS а также tm3:

Как вы видете, TS'(TS транспонировать) v x n а также tm3 является mn x v, В тм3 есть блоки, которые имеют размер n x v -- имеются m блоки такого размера. Обратите внимание, что размер TS' имеет размер v x n, Это означает, что я могу умножить TS' одним блоком tm3который снова имеет размер n x v, Это приведет к матрице, которая v x v по размеру. Я хотел бы сделать эту операцию - умножение индивидуально TS' каждым из n x vблоки tm3, который будет производить mv x v матрицы.

Отсюда, однако, я хотел бы получить диагональные элементы от каждого из этих v x v матрицы. Итак, для одного v x v матрица, обозначенная как a:

В конечном счете, я хотел бы сделать это для каждого из mv x v матрицы дают мне что-то похожее на следующее, где s это mthv x v матрица:

Если я обозначу эту последнюю матрицу как Q, который m x v по размеру тривиально суммировать элементы по строкам для получения m x 1 вектор, который я искал. Я буду ссылаться на этот вектор как C, Тем не менее, я хотел бы разделить каждый из этих m скалярные значения по соответствующей строке матрицы Q, чтобы произвести другой m x v матрица:

Это последняя матрица, которую я ищу. Надеюсь, это поможет понять, что я ищу. Спасибо, что нашли время, чтобы прочитать это!

Мысль: я почти уверен, что смог бы добиться этого, преобразовав tm3 к cell матрица, делая tc1 = mat2cell(tm3,repmat(length(Train),1,m),length(Sig)), а затем положить копию TSm раз в другом cell матрица tc2 = mat2cell(TS',length(indirectSigma),repmat(length(Train),1,m))', Наконец, я мог сделать такие операции, как tc3 = cellfun(@(a,b) a*b, tc2,tc1,'UniformOutput',false), который дал бы мне m клетки, заполненные v x v матрицы, которые я искал. Я мог бы продолжить оттуда. Тем не менее, я не уверен, насколько быстро эти cell операции есть. Кто-нибудь может прокомментировать? Боюсь, что они могут быть медленными, поэтому я бы предпочел, чтобы операции выполнялись на обычных матрицах, которые, как я знаю, бывают быстрыми. Спасибо!

0 ответов

Другие вопросы по тегам