Векторизация проекции в octave/matlab

В линейной алгебре мы можем спроецировать вектор v на подпространство U, взяв ортонормированный базис b(1), b(2), b(3),... b(n) этого подпространства и вычислив сумму скалярные произведения b и v(i), умноженные на вектор v(i), т.е. (v,b(i))*b(i), суммированные по i.

Предположим, что мы сохранили базисные векторы в матрице B так, что ее строки являются векторами b(1), b(2), ..., b(n).

Я нашел способ вычислить это с помощью цикла for:

proj = 0
for i=1:n
 proj = proj + (B(i,:)*v)*(B(i,:)');
end

Есть ли векторизованная версия этой процедуры?


person Roland    schedule 16.03.2014    source источник


Ответы (1)


С умножением матриц:

proj = B.'*B*v(:);

Это дает тот же результат, что и ваш код, как вектор-столбец.

Если вам нужен результат в виде вектора-строки:

proj = v(:).'*B.'*B;
person Luis Mendo    schedule 16.03.2014
comment
В чем разница между v и v(:)? Как ведет себя .'* ? До сих пор я встречал . как «по входу». Что такое поэлементная транспозиция? - person Roland; 16.03.2014
comment
v здесь обозначает вектор. Это может быть вектор строки или столбца. Поэтому я использую v(:), чтобы заставить его стать вектором-столбцом. И тогда v(:).' — это вектор-строка, потому что .' означает транспонирование (многие думают, что ' означает транспонирование, но это сопряженное транспонирование). Наконец, .'* не имеет особого значения; это просто .' (транспонирование), а затем * (умножение матриц) - person Luis Mendo; 16.03.2014