-2

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

4 回答 4

5

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(:));
于 2012-12-06T13:55:37.150 回答
1

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

我想知道为什么有人会编码你所做的事情。您有两个循环将数据加载到向量中,然后您找到 x、y 和 z 的最小值。为什么不只是在循环值时找到最小值?无需调用 min。

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

于 2012-12-06T13:12:38.787 回答
1

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

我同意达菲莫;为什么不摆脱整个双循环并编写

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

或者

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

或适用于您的案例的那些工具的其他排列?

于 2012-12-06T13:33:21.717 回答
0

除非您掌握了一些相当基本的故障排除技能,否则调试代码(因此通常是编写代码和编程)对您来说将是非常困难、痛苦和不愉快的。我第十次问你:

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

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

它是在进步但进展缓慢吗?当你停止执行时,什么是size(x_t)

如果size(x_t)是 l(或接近 l),则您的数组尚未充分初始化。您可能应该看看 Jonas 的出色回复。

坦率地说,我已经投票结束这个问题,因为它过于本地化。也许您应该尝试以这样一种方式解决它,它显示您的一些努力(除了强调您的朋友和他的机器和他的 RAM)强调您为解决问题及其结果所做的操作。

于 2012-12-06T14:02:13.293 回答