gpt4 book ai didi

matlab - MATLAB 是否在常量空间中执行基本数组操作?

转载 作者:行者123 更新时间:2023-12-05 08:00:35 29 4
gpt4 key购买 nike

我在这行 MATLAB 代码中遇到内存不足错误:

result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
A(2:xmax+1,2:ymax+1,2:zmax+1) .* B(1:xmax,1:ymax,1:zmax)) ./ C

其中 C 是另一个数组。这是在 32 位 MATLAB 上(我目前似乎无法获得 64 位版本,这将暂时解决我的问题)。

结果数组 A、B 和 C 已预先初始化并且永远不会更改大小。那么我猜测这个计算不是在常量空间中执行的。

这是正确的吗?有没有办法让它运行或检查它是否在恒定空间中运行?

这些数组的大小大约为 (250, 250, 250)。

如果 MATLAB 不以恒定大小运行它,有没有人知道 Octave 或 Julia 或(插入类似的语言)是否有任何经验?

编辑 1:

我删除了多余的数组。有 10 个 258 x 258 x 338 的数组,对应 1.67 GB。还有很多其他变量,但它们要小得多。给出的计算进行了简化,计算形式为:

R = (A(3Drange) .* B(3Drange) + A(new_3Drange) .* D(new_3Drange) + . . . ) ./ C

范围通常仅相差正负 1 或 2。

内存命令的输出:

Maximum possible array:    669 MB (7.013e+08 bytes) *
Memory available for all arrays: 1541 MB (1.616e+09 bytes) **
Memory used by MATLAB: 2209 MB (2.316e+09 bytes)
Physical Memory (RAM): 8154 MB (8.550e+09 bytes)

* Limited by contiguous virtual address space available.
** Limited by virtual address space available.

显然我应该违反第二行。但是,在我实际对数组执行的第一个操作之前,代码运行良好。也许 MATLAB 在我键入时很懒惰并且没有分配:

A=zeros(xmax+2,ymax+2,zmax+2); 

但仍然在工作区中告诉我变量已分配。

此代码以前适用于较小的数组。 (编辑:但问题似乎是实际内存大小,而不是每个单独数组的大小)。

让我很好奇的是为什么它在分配时没有出错,而是在第一次计算时出错。

编辑 2:

我已确认循环在空间中运行不恒定。在计算过程中分配了大约 0.8 GB 的内存。这是在循环中执行命令时资源使用情况的图像: CPU usage during the loop但是,我尝试将计算分解为多行。我在每次添加时拆分计算并在新命令中添加每个部分,将 R 视为累加器。结果是一次分配的内存较少,但可能更频繁。这是图片:CPU usage during the new loop

我仍然很好奇为什么 MATLAB 不想在常量空间中执行此操作。我认为这可能与索引的移动有关 - 我计划稍后对其进行更多调查,然后将所有这些放在一起作为答案,但有人可能会先于我,这也很棒。不过,现在我可以运行我正在寻找的数组大小并可以完成我的项目。

最佳答案

我想大部分问题都已经回答了:

它是否在恒定空间中运行?

不,正如您验证的那样,它没有。

为什么它不在常量空间中运行?

Matlab 声称在向量化矩阵运算方面速度很快,但并没有过多强调内存效率。

现在怎么办?

这里有不同的选择,如果可能的话首选第一个,另外两个当然可以。

  1. 使其适合,例如升级到 64 位 matlab 或不在您的工作区中放置其他东西
  2. 处理矩阵的一部分,例如将其切成两半
  3. 根本不使用矢量化,而是做一个简单的 for 循环

如果不矢量化,您将获得最小空间解决方案。

关于matlab - MATLAB 是否在常量空间中执行基本数组操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18026716/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com