当我尝试创建一个非常大的矩阵,例如40000x40000时,我遇到了matlab的问题。
例如:
X =零(40000,40000);
错误信息是“???超出了程序允许的最大变量大小。”
有没有解决方案。
另外我还有另一个问题,我们是否可以使用可变列大小的矩阵,例如java。
答案 0 :(得分:16)
40000 * 40000 *每个数字8个字节= 12 GB,肯定没有足够的内存。
要创建一个包含大量零的巨大矩阵,您需要一个稀疏矩阵:
m = sparse(40000, 40000)
要创建变体数组,可以使用单元格数组:
m = cell(3, 1)
m(1) = [1,2,3]
m(2) = [2,4,6,8,10]
m(3) = 6+6i
答案 1 :(得分:4)
你可以做很多事情,正如各种答案所指出的那样。正确答案取决于您的实际问题。如果没有64位版本的matlab加上足够的内存来存储那么大的数组,或者以其他方式存储数组,那么就不可能创建如此庞大的数组。您可以离线存储阵列,只在您使用时引入所需内容。
例如,如果这些数字总是小整数,那么使用uint8或int8,或逻辑数组,甚至是单个数组,与双数组相比,所有这些都会降低内存需求。或者根据需要使用稀疏存储表单。很大程度上取决于你将对阵列做什么。
对于一行中可变数量的元素,请在此处使用单元格数组,而不是平面传统数组。
答案 2 :(得分:3)
如果你真的需要一个很大的矩阵,你可以使用Parallel Computing Toolbox(和MATLAB Distributed Computing Server)同时利用几台机器的内存。这将允许你写:
matlabpool open <a large number>
x = distributed.zeros( 40000, 40000 );
答案 3 :(得分:1)
40k * 40k =&gt; 1.6 * 10 ^ 9数字。我相信Zeros将返回花车。所以你需要大约1.6 * 10 ^ 9 Floats * 4 Bytes / Float =&gt;只有这一个变量的6.4GB RAM ......
你真的觉得你需要这么大的阵列吗?
答案 4 :(得分:1)
解决内存问题的一种方法可能是为矩阵创建matfile。我理解它的方式是它跳过内存并将其直接写入硬盘。我已经尝试过这个对于我的懦弱的计算机内存而言太大的矩阵,而且它很慢,但确实有效。你可能不得不一次建立它。
答案 5 :(得分:0)
在matlab中,你可以将新的col /行附加到矩阵中以形成更大的矩阵。
啊,但你的意思是,你有一个矩阵,其中一列是10行,另一列是20。不,你做不到。没想到你可以用Java tbh。
答案 6 :(得分:0)
我认为使用硬盘文件存储该数据是最佳选择