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

MATLAB是否在常量空间中执行基本数组操作?,matlab,memory,Matlab,Memory,我在这行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是预先初始化的,并且永远不会更改大小。我猜这

我在这行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是预先初始化的,并且永远不会更改大小。我猜这个计算不是在恒定空间中进行的

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

这些阵列的大小约为(250250250)

如果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的内存。以下是在循环中执行命令时资源使用情况的图像: 但是,我尝试将计算分成多行。我在每次加法时分割计算,并在新命令中添加到每个部分,将
R
视为累加器。结果是一次分配的内存更少,但可能更频繁。图片如下:


我仍然很好奇为什么MATLAB不想在恒定空间中执行这个。我认为这可能与索引被转移有关——我计划稍后再进一步调查,然后将所有这些放在一个答案中,但有人可能会击败我,这也会很好。不过,现在我可以运行我正在寻找的数组大小,并可以完成我的项目。

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

它在恒定的空间中工作吗? 不,正如你所证实的,它不是

为什么它不能在恒定的空间中工作? Matlab声称在矢量化矩阵运算方面速度很快,但并没有太多强调内存效率

现在该怎么办? 这里有不同的选择,第一个是首选的,如果可能的话,其他两个当然是可能的

  • 例如,通过升级到64位matlab或不在您的工作区中放置其他stuf,使其适合
  • 处理矩阵的某些部分,例如,将其切成两半
  • 不要使用矢量化,而是做一个简单的for循环

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

    是什么让您认为它不是在恒定空间中运行的?请查看是否可以预先分配
    结果。这至少可以看出一切是否合适。试着分配重复变量,例如
    1:xmax
    a=1:xmax
    a(a,b,c)。*b(a+1,b+1,c+1)+a(a+1,b+1,c+1)。*b(a,b,c))。/c
    一个250x250x250的双精度
    数组应该只有125MB左右。其中三个是375MB;包含一个临时和一个结果的空间会将其增加到625MB。这对于MATLAB来说应该很容易处理,除非你有一大堆其他的数组。当这三个数组是工作区中唯一的变量时,尝试运行计算。为什么不在常量空间中执行它?因为内存分配速度很快,而且它们不再针对仍然使用旧32位计算机/操作系统/版本的人而设计。如今,对于Matlab所做的许多事情,使用内存几乎总是比使用CPU快。阅读更多。