我必须创建一个非常大的3D矩阵(例如:500000x60x60
)。有没有办法在matlab中做到这一点?
当我尝试
时omega = zeros(500000,60,60,'single');
我收到out-of-memory
错误。
稀疏函数不是选项,因为它仅适用于2D矩阵。对于更高维矩阵,还有其他选择吗?
答案 0 :(得分:8)
Matlab仅支持稀疏矩阵(2D)。对于3D张量/阵列,您必须使用变通方法。我能想到两个:
您可以像这样创建稀疏矢量:
A = spalloc(500000*60*60, 1, 100);
其中最后一个条目(100
)指的是最终要分配给A
的非零数量。如果您事先知道此数量,则会使A
的内存使用效率更高。如果你事先不知道它只是使用一些接近它的数字,它仍然可以工作,但A
最终会消耗更多的内存而不是它真正需要的内存。
然后你可以将元素称为像这样的3D数组:
A(sub2ind(size(A), i,j,k))
其中i
,j
和k
分别是第1,第2和第3维度的索引。
将3D张量/数组中的每个2D页面创建为单元格数组:
a = cellfun(@(x) spalloc(500000, 60, 100), cell(60,1), 'UniformOutput', false);
同样的故事也是最后一次进入spalloc
的故事。然后在3D中连接如下:
A = cat(3, a{:});
然后你可以像这样引用个别元素:
A{i,j,k}
其中i
,j
和k
分别是第1,第2和第3维度的索引。
答案 1 :(得分:6)
由于您的矩阵稀疏,请尝试使用ndsparse(N维稀疏数组FEX)