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
, который будет производить m
v x v
матрицы.
Отсюда, однако, я хотел бы получить диагональные элементы от каждого из этих v x v
матрицы. Итак, для одного v x v
матрица, обозначенная как a
:
В конечном счете, я хотел бы сделать это для каждого из m
v x v
матрицы дают мне что-то похожее на следующее, где s это mth
v 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))
, а затем положить копию TS
m
раз в другом 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
операции есть. Кто-нибудь может прокомментировать? Боюсь, что они могут быть медленными, поэтому я бы предпочел, чтобы операции выполнялись на обычных матрицах, которые, как я знаю, бывают быстрыми. Спасибо!