我正在用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!