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

在我的代码中,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>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所说的冗余计算之外,您几乎可以尝试并做出更大的贡献这很快。非常感谢你的指导性的例子。这真的很有用!“啄木鸟谢谢,如果它回答你的问题,就考虑接受它吧!”