我在我自己的电脑上安装了Matlab R2012a,在我朋友的电脑上安装了Matlab R2009a(多线程).由于我的电脑只有2GB内存,而我的朋友有128GB和更好的处理器,我决定在我朋友的电脑上执行我的代码.
我使用远程桌面连接程序连接到他的计算机,从dropbox下载了我的代码和数据集并执行了我的代码.但是,即使一小时过去,我的代码执行也没有完成.(在我的电脑上花了大约20分钟,如果你认为我朋友的系统比我的系统好得多,它应该花不到20分钟.)然后我等了几个小时,但执行没有完成.
然后,为了解问题的位置,我逐步评估了代码,并注意到它无法完成以下循环的执行:
l=1;
for n=1:max_t
for m=1:t(1,n).numberofPoints
x_t(l)=t(1,n).matrix(m,1);
y_t(l)=t(1,n).matrix(m,2);
z_t(l)=t(1,n).matrix(m,3);
l=l+1;
end
end
minx = min(x_t(:));
miny = min(y_t(:));
minz = min(z_t(:));
Run Code Online (Sandbox Code Playgroud)
它只是一个简单的循环来获得x,y,z坐标的最小点.(我确信这个循环没有任何问题.它可以在我的PC上成功运行.)我知道我不需要循环来获得结构的最大和最小点,但我是MATLAB的新手并且不太了解.因此对我来说这似乎是最简单的选择.
我真的必须能够使用我朋友的电脑,因为我的公羊对于进一步的过程是不够的.因此我需要解决这个问题.
可能是因为相同的代码在我的计算机上运行而在朋友的计算机上运行的原因是什么?
Matlab R2011a 在循环中增加阵列时引入了显着的性能改进,我相信R2012a进一步改进了这些.
因此,在R2009中,循环只需要更长的时间来运行,因为您没有预先分配x_t.
还有其他方法可以改进您的代码,在这里我只需修复预分配:
l=1;
%# preallocate with NaN, so that the values don't interfere with
%# taking the minimum later
lMax = sum([t(1,1:max_t).numberofPoints)]);
[x_t,y_t,z_t] = deal(NaN(lMax,1));
for n=1:max_t
for m=1:t(1,n).numberofPoints
x_t(l)=t(1,n).matrix(m,1);
y_t(l)=t(1,n).matrix(m,2);
z_t(l)=t(1,n).matrix(m,3);
l=l+1;
end
end
minx = min(x_t(:));
miny = min(y_t(:));
minz = min(z_t(:));
Run Code Online (Sandbox Code Playgroud)