【问题标题】:MATLAB - Problems with large arraysMATLAB - 大型数组的问题
【发布时间】:2015-06-02 16:20:53
【问题描述】:

下面的代码非常适合小向量。

[X1, X2]=meshgrid(Data1(:,1), Data2(:,1));
[Y1, Y2]=meshgrid(Data1(:,2), Data2(:,2));
[Z1, Z2]=meshgrid(Data1(:,3), Data2(:,3));

Rxy = sqrt( (X1-X2).^2 + (Y1-Y2).^2 );
Rz = abs( Z1-Z2 );

[I1, I2] =find( Rxy<=100 & Rz<=0.2);

但是,由于我处理大量数据,matlab 不支持且无法正常工作。 Matlab 生成以下消息:

使用 repmat 时出错请求的 75027x68517 (38.3GB) 数组超出 最大数组大小首选项。创建大于此的数组 limit 可能需要很长时间并导致 MATLAB 变得无响应。 有关详细信息,请参阅数组大小限制或首选项面板。

寻找“内存不足错误”的替代方法,但我没有得到有效的方法。我做了一个循环来运行,但它非常慢。

【问题讨论】:

  • 您使用的是 64 位系统吗?
  • 哎呀...矩阵大小是巨大的。让我们退后一步。你能向我们解释一下你想要做什么吗?如果我们知道该代码的用途,那么我们甚至可以提供替代方案。
  • 是的,我使用的是 windows x64。
  • 我是一名海洋学家,从事测深数据分析 (.xyz)。其中 X 是位置,位置 Y 是 Z 是水深我正在制作一个程序来加入将构成地形剖面的线段。首先,我选择并识别段,后验,我找到两个段之间的交集。在这个集合中,我找到了最好的连接点。此点距离应小于10m,Z差(水深)应小于0.2m。所以我找到了加入个人资料的可能要点。
  • 如果您有足够的内存,MATLAB 不应阻止您创建该数组(假设您有 >40 GB 的 RAM)。见here。可能是repmat的限制。尽量不要使用 repmat 来复制数组。见here。另外,如果您觉得使用循环会浪费您的时间,为什么不编写一个 MEX 文件,这样可以节省您的时间。

标签: arrays matlab vector


【解决方案1】:

大概meshgrid 在内部使用repmat 来创建一些庞大的矩阵。看看bsxfun,它允许这些类型的操作而无需实际复制数据。来自帮助:

C = bsxfun(fun,A,B) 应用逐元素二元运算 由函数句柄 fun 指定的数组 A 和 B,带有单例 已启用扩展。

因此,您示例的第 5 行将变为(未经测试,目前没有可用的 Matlab:

Rxy = sqrt( bsxfun(@minus, Data1(:,1), Data2(:,1)).^2 + bsxfun(@minus, Data1(:,2), Data2(:,2)).^2 );

并类似地更改下面的行。

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 2012-01-11
    • 1970-01-01
    • 2011-01-24
    • 2015-11-20
    • 1970-01-01
    • 2012-06-03
    • 2014-08-16
    • 1970-01-01
    相关资源
    最近更新 更多