Matlab在高维矩阵算术运算中怎么会这么慢?
How Matlab can be so slow in high dimensional matrix arithmetic operation?
我的代码中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、expz、expk、expkn、amgrid、bmgrid、amgridn、bmgridn都是8*D矩阵。似乎不是逻辑运算符部分使事情变慢了。我只是不明白为什么它会占用 10 秒....
有没有人看到问题出在哪里?非常感谢!就因为这条线,我真的被缓慢的性能杀死了...
有时处理高维矩阵确实很慢。我将展示这个比较二维矩阵和你的矩阵的速度。矩阵的大小大致相同。
m = function fRef1()
m = rand(5000,10000); % Generate an unsorted matrix to ensure worst case behaviour
end
运行 timeit
函数,
timeit(@fRef1,1)
二维矩阵的矩阵生成需要0.7058s
m = function fRef2()
m=rand(10,10,10,10,5,10,10,10);
end
timeit(fRef2,1)
而对于 8D 矩阵,它需要 0.7277s,速度大致相同。
现在测试做一个简单的矩阵运算
function M = f1()
m = rand(5000,10000);
M = m.^2.*m+m;
end
其中 timeit
需要 0.9449 秒。使用 fRef1
的结果,您可以看到矩阵运算大约需要 0.24 秒。
现在与 8D 矩阵进行比较
function M = f2()
m = rand(10,10,10,10,5,10,10,10);
M = m.^2.*m+m;
end
其中 timeit
需要 1.2553 秒。从 fRef2
中删除时间,您将获得矩阵运算的时间。计算时间为 0.5276s,大约是二维矩阵时间的两倍。那么我们可以做得更好吗?答案是肯定的!由于操作是按元素进行的,因此操作与矩阵的形状无关。然后让我们将矩阵修改为 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 的结果,这与二维矩阵的时间大致相同。
Windows7、英特尔酷睿 i5-2540M、2.60GHz、Matlab 2014b
我的代码中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、expz、expk、expkn、amgrid、bmgrid、amgridn、bmgridn都是8*D矩阵。似乎不是逻辑运算符部分使事情变慢了。我只是不明白为什么它会占用 10 秒.... 有没有人看到问题出在哪里?非常感谢!就因为这条线,我真的被缓慢的性能杀死了...
有时处理高维矩阵确实很慢。我将展示这个比较二维矩阵和你的矩阵的速度。矩阵的大小大致相同。
m = function fRef1()
m = rand(5000,10000); % Generate an unsorted matrix to ensure worst case behaviour
end
运行 timeit
函数,
timeit(@fRef1,1)
二维矩阵的矩阵生成需要0.7058s
m = function fRef2()
m=rand(10,10,10,10,5,10,10,10);
end
timeit(fRef2,1)
而对于 8D 矩阵,它需要 0.7277s,速度大致相同。
现在测试做一个简单的矩阵运算
function M = f1()
m = rand(5000,10000);
M = m.^2.*m+m;
end
其中 timeit
需要 0.9449 秒。使用 fRef1
的结果,您可以看到矩阵运算大约需要 0.24 秒。
现在与 8D 矩阵进行比较
function M = f2()
m = rand(10,10,10,10,5,10,10,10);
M = m.^2.*m+m;
end
其中 timeit
需要 1.2553 秒。从 fRef2
中删除时间,您将获得矩阵运算的时间。计算时间为 0.5276s,大约是二维矩阵时间的两倍。那么我们可以做得更好吗?答案是肯定的!由于操作是按元素进行的,因此操作与矩阵的形状无关。然后让我们将矩阵修改为 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 的结果,这与二维矩阵的时间大致相同。
Windows7、英特尔酷睿 i5-2540M、2.60GHz、Matlab 2014b