Matlab在高维矩阵运算中怎么会这么慢?
在我的代码中,Matlab矩阵算术运算的低速度给我留下了深刻的印象,如下所示:Matlab在高维矩阵运算中怎么会这么慢?,matlab,matrix,arithmetic-expressions,Matlab,Matrix,Arithmetic Expressions,在我的代码中,Matlab矩阵算术运算的低速度给我留下了深刻的印象,如下所示: pitemp=zeros(nz,na,nb,nk,nxi,nann,nbn,nkn); pitemp=alphal^(alphal*alphares)*alpham^(alpham*alphares)*expz.^alphares.*expk.^((eta-alphal-alpham)*alphares)+(1-delta)*expk-expkn... -ximgrid.*(expkn./expk-1+delta
pitemp=zeros(nz,na,nb,nk,nxi,nann,nbn,nkn);
pitemp=alphal^(alphal*alphares)*alpham^(alpham*alphares)*expz.^alphares.*expk.^((eta-alphal-alpham)*alphares)+(1-delta)*expk-expkn...
-ximgrid.*(expkn./expk-1+delta>zeta | expkn./expk-1+delta<-zeta)+rd*amgrid-rl*bmgrid-amgridn+bmgridn;
pitemp=0(nz、na、nb、nk、nxi、nann、nbn、nkn);
pitemp=alphal^(alphal*alphares)*alpham^(alpham*alphares)*expz.^alphares.*expk.^(eta alphal alpham)*alphares)+(1-delta)*expk expkn。。。
-ximgrid.*(expkn./expk-1+delta>zeta | expkn./expk-1+delta高维矩阵有时处理起来确实很慢。我将通过比较2D矩阵和您的矩阵的速度来说明这一点。矩阵的大小大致相同
m = function fRef1()
m = rand(5000,10000); % Generate an unsorted matrix to ensure worst case behaviour
end
运行timeit
功能
timeit(@fRef1,1)
2D矩阵的矩阵生成时间为0.7058秒
m = function fRef2()
m=rand(10,10,10,10,5,10,10,10);
end
timeit(fRef2,1)
对于8D矩阵,它需要0.7277秒,这大约是相同的速度
现在测试一个简单的矩阵运算
function M = f1()
m = rand(5000,10000);
M = m.^2.*m+m;
end
使用timeit
需要0.9449s。使用fRef1
的结果,您可以看到矩阵运算大约需要0.24s
现在比较8D矩阵
function M = f2()
m = rand(10,10,10,10,5,10,10,10);
M = m.^2.*m+m;
end
使用time时,它需要1.2553s。从fRef2
中删除时间,您将得到矩阵运算的时间。计算时间是0.5276s,大约是2D矩阵时间的两倍。因此我们能做得更好吗?答案是肯定的!因为运算是按元素进行的,运算与形状无关然后,让我们将矩阵修改为a,以便Matlab找到更合适的
function M=f3()
m=rand(10,10,10,10,5,10,10,10);
m=m(:); % Create a row vector
M=m.^2.*m+m;
M = reshape(M,10,10,10,10,5,10,10,10); % reshape the matrix again to
% its original shape
end
timeit
给出了0.9494s的结果。通过删除创建m
的时间,我们得到了0.2217s的结果,这与2D矩阵的时间大致相同
Windows 7、intel core i5-2540M、2.60GHz、Matlab 2014b它很容易成为一个非常大的矩阵,具有如此多的维度,即使每个维度都相对较小。当操作耗时10秒时,您使用的nz、na、nb、nk、nxi、nann、nbn、nkn
的值是什么?您的数组有5000万个元素……考虑到您的矩阵是50000个000个元素,或大约400MB的RAM,这是相当大的。10秒对我来说似乎是合理的。还有,当你只是用第二行覆盖内存时,你预分配内存的意义是什么。我还想补充一点,在这种情况下,将所有内容放在一行代码中是不好的。这使得它非常不可读,并且很难被读取ebug.去掉不必要的操作以提高性能。在(expkn./expk-1+delta>zeta | expkn./expk-1+delta10秒用于5e7
元素是非常合理的。您输入的大小也影响您的计时。如果您在一个中等大小的矩阵上尝试此方法,那么您将看到它的速度更快。除了Daniel所说的冗余计算之外,您几乎可以尝试并做出更大的贡献这很快。非常感谢你的指导性的例子。这真的很有用!“啄木鸟谢谢,如果它回答你的问题,就考虑接受它吧!”