我必须创建一个非常大的3D矩阵(例如:500000x60x60)。有没有办法在matlab中做到这一点?
当我尝试的时候
omega = zeros(500000,60,60,'single');我得到一个out-of-memory错误。
稀疏函数是没有选项的,因为它只适用于2D矩阵。那么,对于高维矩阵,有没有什么替代方法呢?
发布于 2012-09-29 01:56:04
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维的索引。
发布于 2012-09-29 01:15:00
由于您的矩阵是稀疏的,请尝试使用ndsparse (N维稀疏数组FEX)
https://stackoverflow.com/questions/12643279
复制相似问题