为啥 mxCreateNumericMatrix 最大尺寸小于系统最大数组尺寸?

Posted

技术标签:

【中文标题】为啥 mxCreateNumericMatrix 最大尺寸小于系统最大数组尺寸?【英文标题】:Why is mxCreateNumericMatrix maximum size smaller than system maximum array size?为什么 mxCreateNumericMatrix 最大尺寸小于系统最大数组尺寸? 【发布时间】:2013-10-10 18:04:53 【问题描述】:

我正在尝试在 MEX 函数中创建一个矩阵。以下作品:

uint64_t N;
N = 2147483647; // N = 2*2^30 -1
plhs[0] = mxCreateNumericMatrix(N,1,mxUINT8_CLASS,mxREAL);

但是,我无法创建这样大小的数组:

uint64_t N;
N = 2147483648; // N = 2*2^30
plhs[0] = mxCreateNumericMatrix(N,1,mxUINT8_CLASS,mxREAL);

上述代码抛出错误:

maximum variable size allowed by the function exceeded

这令人困惑,因为我的系统(运行 64 位 Matlab 2010b 的 64 位 Linux)告诉我最大数组大小实际上非常大。

[~,M] = computer
M = 
    281474976710655 % 2^48 -1 for those of you keeping track

此外,通过命令行,我能够创建非常大的数组,并且已经很开心有一段时间了,调用如下:

a = zeros(16*2^30,1,'uint8');
disp(uint64(numel(a)))
17179869184

我的问题是,为什么我无法在我的 mex 函数中创建我可以从命令行或其他 *.m 函数创建的数组?

谢谢。

附: - 我也在 Mathworks 论坛上问过这个问题。我想我会撒一张尽可能大的网。如果先在那里回答,我会在这里发布。

【问题讨论】:

【参考方案1】:

答案在于编译器选项。默认情况下,Matlab 将大小限制为 2^31-1。要增加大小,必须在您的 mex 编译命令中包含以下选项。

mex -largeArrayDims myFunction.c

【讨论】:

我不知道为什么这还没有成为 64 位 MATLAB 安装的默认设置。

以上是关于为啥 mxCreateNumericMatrix 最大尺寸小于系统最大数组尺寸?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?