【问题标题】:Same MATLAB code working on R2012a but not on R2009a相同的 MATLAB 代码适用于 R2012a,但不适用于 R2009a
【发布时间】:2012-12-06 12:56:56
【问题描述】:

我在自己的电脑上安装了 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 新手,并且不太清楚。因此,这对我来说似乎是最简单的选择。

我真的必须能够使用我朋友的电脑,因为我的内存不足以进行进一步的处理。所以我需要解决这个问题。

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

【问题讨论】:

  • “它无法完成以下循环”到底是什么意思?
  • @carlosdc 它没有完成那个for循环的执行?
  • Amadeus:它会启动然后突然停止吗?它没有开始吗?它有进展吗?进步多少?它是否因错误而失败?它会完成一次内循环吗?
  • @carlosdc 我很确定它确实取得了进展。因为当我通过 ctrl+C 停止执行时,很明显数组 x_t 和 y_t 中有元素。它从未突然停止。为了了解内部循环是否完成,我尝试显示一个句子,但没有显示它。
  • 我相信“未完成”只是意味着它没有在合理的时间内完成。当您在较新的版本中未能预先分配时,Matlab 减轻了伤害,但在 R2009a 等较旧版本中,如果您在自己的脚上开枪,您将不会再快速浏览您的代码。

标签: matlab for-loop


【解决方案1】:

growing arrays in a loop 时,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(:));

【讨论】:

  • 但他在两台机器上做同样的事情。当他未能在自己的机器上进行预分配时,它运行良好。这可以解释效率低下,但不能解释两台机器之间的区别。
  • @duffymo 他正在开发一种在未初始化的数组上运行速度不会那么慢的设备,并在进行测试。
  • 所以你假设他们安装了两个不同版本的 Matlab?如果这是真的,那就是物质上的区别。在这种情况下,我同意你的看法。我看原帖里没有说。除非我错过了它们,否则只引用了 CPU 和 RAM 的差异。
  • @duffymo:OP 确实声明有两个不同版本的 Matlab(从顶部开始的第二句):I have Matlab R2012a installed on my own computer and Matlab R2009a (multi thread) installed on my friend's computer. 我已经编辑了问题的标题,使其更加明显。跨度>
  • 感谢您的澄清。这是一个关键点,我错过了。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,你是对的,但正如我在我的问题中所说:“我知道我不需要循环来获得结构的最大和最小点,但我是 MATLAB 新手,知道的不多。因此对我来说,这似乎是最简单的选择。”我复制了数组,因为我无法直接应用最小值或最大值。无论如何,我打算寻找一种更有效的解决方案来获得最大值和最小值。但是我无法理解并想知道为什么在我的计算机上运行的代码无法在我朋友的计算机上运行的有趣原因。
  • 是的,您可以轻松获得最小值和最大值。不,你没有提供足够的信息来弄清楚为什么你朋友的电脑不会这样做。投票结束。
【解决方案3】:

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

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

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

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

或适合您的情况的这些工具的其他排列?

【讨论】:

  • minx = min( cellfun(@(x)min(x(:)), {tracks(1,:).matrix(:,1)}, 'uni',0) ); Scalar index required for this type of multi-level indexing. minx = min( [tracks(1,:).matrix(:,1)] ) Scalar index required for this type of multi-level indexing.
  • @Amadeus:“或适用于您的情况的这些工具的其他排列”
  • @Amadeus:例如,参见stackoverflow.com/questions/13575523/…
  • @Amadeus:哦等等……你是同一个人! :)
  • @RodyOldenhius 是的,我是。我的目标是了解在我的计算机上运行的代码在我朋友的计算机上无法运行的原因可能是什么。我知道我的循环效率不高,但它是问题发生的位置。因此我把它放在这里。但我想我的问题出轨了。
【解决方案4】:

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

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

如果 l 的值为 1,您可能会遇到一些异常表现的 Matlab 许可问题。努力解决这个问题。

进展缓慢吗?当您停止执行时,size(x_t) 是什么?

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

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

【讨论】:

    猜你喜欢
    • 2022-10-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2014-01-25
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多