MATLAB中的最大数组大小?

我正在编写一个MATLAB程序,该程序将生成具有100万行和未知数量列的矩阵(最大值为100万)。

我试着预先分配这个矩阵:

a=zeros(1000000,1000000)

但我收到错误:

“程序所允许的最大可变大小已超出。”

我有一种感觉,不预先分配这个矩阵会严重降低代码的速度。

这让我很好奇:MATLAB中最大的数组大小是多少?

更新:我将研究稀疏矩阵,因为我针对这个特定问题的结果将是一个包含大部分零的矩阵。


看看这个页面,它列出了最大尺寸:最大尺寸

它看起来大约是几亿美元。 请注意,您尝试在此创建的矩阵是:10e6 * 10e6 = 10e12个元素。 这比所提供的最大尺寸大很多个数量级,并且您的系统上没有那么多的RAM。

我的建议是看看你正在努力完成的一个不同的算法。


要找出真正的最大阵列大小(仅限Windows),请使用命令user = memory。 user.maxPossibleArrayBytes显示连续RAM有多少个字节是空闲的。 除以数组中每个元素的字节数(8为双精度),并且知道可以预分配的元素的最大数量。

请注意,正如木片所说,Matlab可能不得不复制你的数组(例如,如果你通过值传递给子函数)。 根据我的经验,75%的最大可能阵列通常可用多次。


限制

有两个不同的限制需要注意:

  • 无论当前的内存可用性如何,MATLAB允许的最大数组大小(以元素数量表示)。
  • 当前可用于单个阵列的字节 - (当前)最大可能阵列大小(以字节为单位)。
  • 第一个限制是“超出程序允许的最大变量大小”而不是第二个限制。 然而,第二个也是你必须注意的实际限制!

    检查限制

    如下检查数组允许的最大元素数量:

    >> [~,maxsize] = computer
    maxsize =
       2.8147e+14
    

    根据computer命令的文档,这返回:

    此版本的MATLAB中矩阵中允许的最大元素数量

    这是对元素数量的静态MATLAB限制 ,不受计算机状态(硬件规格和当前内存使用情况)的影响。 对于这种长度的double数组,超过2PB,也比我知道的任何计算机都高。

    另一方面,您可以在任何特定时刻创建的最大实际数组大小可以通过memory命令进行检查:

    >> memory
    Maximum possible array:     35237 MB (3.695e+10 bytes) *
    Memory available for all arrays:     35237 MB (3.695e+10 bytes) *
    Memory used by MATLAB:      9545 MB (1.001e+10 bytes)
    Physical Memory (RAM):     24574 MB (2.577e+10 bytes)
    
    *  Limited by System Memory (physical + swap file) available.
    

    正如消息所述,这些值基于实际的当前内存可用性 ,同时考虑物理内存和交换文件(统称为虚拟内存)。

    如果需要,这些值可以通过m = memory;编程方式访问m = memory;

    调整限制

    第一个限制(硬限制)已被修复,直到R2015a,现在可以通过以下设置更改(但仅减少到系统内存的一小部分):

    在这里输入图像描述

    您无法将其增加超出系统限制。

    第二个限制在MATLAB中显然没有“设置”,因为它基于可用内存和计算机配置。 除了添加RAM之外,你可以做的事情不多:(1) pack整合工作区内存并执行“垃圾回收”,但这可能只对某些平台有所帮助,(2)增加页面文件大小以允许其他内容换掉并给MATLAB更多的物理内存。 但在依赖页面文件时要谨慎,因为如果页面文件出现抖动,您的计算机可能无响应。

    链接地址: http://www.djcxy.com/p/29269.html

    上一篇: Maximum array size in MATLAB?

    下一篇: How to get the type of a variable in MATLAB?