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

时间:2013-06-16 12:54:49

标签: matlab matrix-multiplication

我正在研究MATLAB中的一个软件,我相信在优化和效率方面,我已经达到了我的知识极限。这里是StackOverflow上人员的专业知识可能会有所帮助。

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

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

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

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

我尝试搜索Google等,但遗憾的是我不知道要搜索的关键字。如果这是重复,我道歉。

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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.