我有一些我一直在使用的MATLAB代码。有三个部分,比如A,B和C. A和C可以改变,B无论如何都保持不变。
我所做的是将A,B和C分成单独的.m文件(不是函数,只是脚本)。 A只创建一组变量,B包含逻辑,C包含结果的绘图。我将D文件称为文件,我所做的就是将A,B和C的全部内容直接复制/粘贴到彼此之后。
如果我运行A,然后是B,那么C,B内的迭代非常缓慢,每次迭代大约15秒。 如果我运行D(只有A然后B然后C粘贴)它会快速,每次迭代大约2秒。
鉴于MATLAB以完全相同的顺序运行完全相同的代码,为什么两者的执行时间差别如此之大?
答案 0 :(得分:2)
我相信你有记忆问题。 Matlab函数实际上将它们的输入变量作为指针,但是如果你更改数据,它就会成为副本。 因此,如果A,B,C具有较大的输入和输出,并且每一个都修改了一些数据的一小部分,那么就会获得大量的内存分配。
例如:
function Main()
x = imread('peppers.png');
for i=1:size(x,1)
for j=1:size(x,2)
x = ChangePixel(x,i,j);
end
end
imshow(x);
end
function A = ChangePixel(A,i,j)
A(i,j,:) = A(i,j,[3 2 1]);
end
此代码将非常慢,因为ChangePixel每次都会分配一个新矩阵。
有时,Matlab可以检测这些操作并使用内部优化。 但是,人们无法知道它是否会发生,所以最好避免这种操作。
答案 1 :(得分:1)
如果没有可重复的例子,很难说发生了什么。我可以告诉你如何寻找自己。
关闭并重新打开MATLAB,一切都很新鲜。 (或者至少做close all hidden; clear classes; clc;
。)
如果在致电D
,A
,B
之前致电C
,您会得到相同的时间吗?如果你没有清除它们之间的变量,那么MATLAB将不得不第二次做更少的分配。
如果时间相同,那么您需要使用分析器。 (单击桌面 - > Profiler。)配置每个脚本,并记下哪些行很慢。他们匹配了吗?你能看到任何模式吗?你确定在两种情况下都执行相同的代码吗?
如果仍然没有明显的理由为什么时间不同,那么也许Praetorian是正确的,而且这是JIT魔法的深层次。