【发布时间】:2010-02-02 11:14:24
【问题描述】:
当我尝试创建一个非常大的矩阵(例如 40000x40000)时,我遇到了 matlab 问题。
例如:
x=zeros(40000,40000);
错误信息是“???超出程序允许的最大变量大小。”
有什么解决办法吗。
另外我还有一个问题,我们能不能有一个可变列大小的矩阵,比如在 java 中。
【问题讨论】:
标签: matlab
当我尝试创建一个非常大的矩阵(例如 40000x40000)时,我遇到了 matlab 问题。
例如:
x=zeros(40000,40000);
错误信息是“???超出程序允许的最大变量大小。”
有什么解决办法吗。
另外我还有一个问题,我们能不能有一个可变列大小的矩阵,比如在 java 中。
【问题讨论】:
标签: matlab
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
【讨论】:
正如各种答案所指出的那样,您可以做很多事情。正确答案取决于您的实际问题。如果没有 64 位版本的 matlab 加上足够的内存来存储这么大的数组,或者以其他方式存储数组,那么暴力创建如此大的数组是不可能的。您可以离线存储阵列,只在使用时带入您需要的东西。
例如,如果这些数字总是小整数,那么使用 uint8 或 int8,或者逻辑数组,甚至是单数组,所有这些都将比双数组减少内存需求。或者酌情使用稀疏存储形式。很大程度上取决于您将如何处理数组。
就一行中可变数量的元素而言,这里使用元胞数组,而不是平面的传统数组。
【讨论】:
如果你真的需要这么大的矩阵,你可以使用Parallel Computing Toolbox(和MATLAB Distributed Computing Server)同时利用多台机器的内存。这将允许您编写:
matlabpool open <a large number>
x = distributed.zeros( 40000, 40000 );
【讨论】:
40k*40k => 1.6*10^9 个数字。我相信 Zeros 会返回浮点数。所以你需要大约 1.6*10^9 Floats *4 Bytes/Float => 6.4GB 的 RAM 只是为了这个变量...
你确定需要这么大的数组吗?
【讨论】:
解决内存问题的一种方法可能是为您的矩阵创建一个matfile。我理解它的方式是它跳过内存并将其直接写入您的硬盘。我已经尝试过这个对于我的计算机内存来说太大的矩阵,它很慢,但它确实有效。您可能必须一次建立一点。
【讨论】:
不,是的,购买更多内存,如下所述。 Sparse 只是删除零个元素。
在 matlab 中,您可以将新的 col/rows 附加到矩阵中以生成更大的矩阵。
啊,但你的意思是,你能有一个矩阵,其中一列是 10 行,另一列是 20 行。不,你不能那样做。没想到你可以在 Java tbh 中。
【讨论】:
我认为使用硬盘文件来存储数据是最好的选择
【讨论】: