2013-06-16 4 views
1

Я работаю над программным обеспечением в MATLAB, и я считаю, что достиг предела моих знаний, когда дело доходит до оптимизации и эффективности. Вот где может быть полезен опыт людей в StackOverflow.MATLAB - Эффективный вектор-строка * Матрица * column-vector

Использование профилировщика MATLAB, я нашел, что последняя неэффективна строка кода является умножение следующим образом:

function [energy] = getEnergy(S,W) 
    energy = -(S*W*S'); 
end 

S является вектор-строка 1 х N, W является N х N матрица (хотя это не только диагональная матрица), а S' - это вектор-столбец N x 1, умножение которого возвращает число.

Я понимаю, что это примитивная операция, но мне было интересно, есть ли способ ускорить это.

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

Заранее спасибо.

+0

фотография вашего профиля немного оскорбительна. вы бы решили заменить его чем-то менее тревожным? – Shai

+0

@sudosensei Существуют ли какие-либо специальные атрибуты для матрицы 'W'? Например, это [симметричный] (http://en.wikipedia.org/wiki/Symmetric_matrix)? –

+0

Matlab довольно эффективен, когда дело доходит до матричных/векторных продуктов. Используйте 'profiler', чтобы более тщательно определить узкое место. – Shai

ответ

0

Ваша реализация является правильным, и быстро.

Вы можете сэкономить ~ 20-30% от времени вычисления, выполнив его внутри основного кода без вызова функции.

>> S = randn(1, 500); 
>> W = randn(500); 
>> tic; for k = 1 : 10000, e = -(S * W * S'); end; toc 
Elapsed time is 0.321595 seconds. 
+0

Вызов функции действительно был проблемой. Спасибо, Серж. – sudosensei

0

Если узкое место связано с тем, что вам нужно повторить это вычисление для большого количества различных векторов S, то вы можете сделать следующее векторизации:

% s is k-by-N matrix of k row vectors 
energy = sum((s * W) .* s, 2); % note the .* in the middle! 
+0

это не улучшает скорость работы 's * W * s''. – Serg

+0

@Serg, если у вас есть векторы 'k', чем быстрее, чем вызывать' getEergy' 'k' раз. – Shai

+0

@Shai: Я признал ответ Серга как принятый ответ, потому что это было больше связано с тем, что я просил, но я фактически объединил оба ваших ответа, и моя программа значительно ускорилась. Спасибо! – sudosensei

Смежные вопросы