在R2012a上使用相同的MATLAB代码,但在R2009a上没有

时间:2012-12-06 12:56:56

标签: matlab for-loop

我在我自己的电脑上安装了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(:));

获取x,y,z坐标中的最小点只是一个简单的循环。 (我确信这个循环没有任何问题。它可以在我的PC上成功运行。)我知道我不需要循环来获取结构的最大和最小点但是我是MATLAB的新手知道的不多。因此对我来说这似乎是最简单的选择。

我真的必须能够使用我朋友的电脑,因为我的公羊对于进一步的过程是不够的。因此我需要解决这个问题。

同一代码在我的计算机上运行但在朋友的计算机上运行的原因是什么?

4 个答案:

答案 0 :(得分:5)

Matlab R2011a在growing arrays in a loop时引入了显着的性能改进,我相信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(:));

答案 1 :(得分:1)

我不知道为什么它不会在你朋友的电脑上执行。显然除了处理器和RAM之外还有一些不同的东西。

我想知道为什么有人会编码你做的事情。你有两个循环将数据加载到向量中,然后你找到x,y和z的最小值。为什么不在循环遍历值时找到最小值?不需要打电话给分钟。

我不像我想的那样熟悉Matlab,但我也想知道为什么你需要复制矩阵才能做到这一点。矩阵行可以被认为是向量或数组。难道你不能只搜索x,y,z列上的min而不必复制数据吗?

答案 2 :(得分:1)

你写的代码很慢,原因有很多...... 你没有预先分配x_t和朋友,而是在循环中增长它们。 最后你对它们什么都不做,但要计算它们的最大值......

我同意duffymo;为什么不摆脱整个double-for-loop并写

minx = min( [t(1,:).matrix(:,1)] )

minx = min( cellfun(@(x)min(x(:)), {t(1,:).matrix(:,1)}, 'uni',0) );

或那些适合您案例的工具的其他一些排列?

答案 3 :(得分:0)

在你开发一些相当基本的故障排除技巧之前,调试代码(因此编写代码和编程一般)对你来说将是非常困难,痛苦和不愉快的。我问你最后一次:

它取得了多大进展?停止执行时(即按Ctrl-C),l的值是多少?

如果l的值为1,则可能会出现一些奇怪的Matlab许可问题。尝试解决这个问题。

它正在取得进展但进展缓慢吗?停止执行时size(x_t)是什么?

如果size(x_t)为l(或接近l),则表示您尚未充分初始化阵列。您应该看看Jonas的优秀回复。

坦率地说,我已经投票决定将此问题视为过于本地化。也许你应该尝试以这样一种方式来修复它(除了强调你的朋友和他的机器以及他的RAM之外)它会强调你为解决问题及其结果而采取的行动。