MATLAB -高效行向量*矩阵*列向量



我正在用MATLAB开发一个软件,我相信在优化和效率方面,我已经达到了我的知识极限。以下是StackOverflow上的专业知识可能会有所帮助的地方。

使用MATLAB的分析器,我发现最后一行低效的代码是以下形式的乘法:

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

S是一个1 × N行向量,W是一个N × N矩阵(虽然它不仅仅是一个对角矩阵),S'是一个N × 1列向量,其乘法返回一个数字。

我知道这是一个基本的操作,但我想知道是否有任何方法可以加快速度。

我试着搜索谷歌等,但不幸的是我不知道正确的关键词搜索。如果这是重复的,我很抱歉。

你的实现是正确的,也是最快的。

通过在主代码中执行它,而不调用函数,可以节省约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.

如果瓶颈源于您需要为许多不同的向量S重复此计算,那么您可以执行以下矢量化:

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

最新更新