我必须创建一个非常大的 3D 矩阵(例如:)500000x60x60
。在matlab中有什么方法可以做到这一点吗?
当我尝试
omega = zeros(500000,60,60,'single');
我得到一个out-of-memory
错误。
稀疏函数不是选项,因为它仅适用于 2D 矩阵。那么对于高维矩阵,有什么替代方法吗?
我必须创建一个非常大的 3D 矩阵(例如:)500000x60x60
。在matlab中有什么方法可以做到这一点吗?
当我尝试
omega = zeros(500000,60,60,'single');
我得到一个out-of-memory
错误。
稀疏函数不是选项,因为它仅适用于 2D 矩阵。那么对于高维矩阵,有什么替代方法吗?
Matlab 仅支持稀疏矩阵 (2D)。对于 3D 张量/数组,您必须使用一种解决方法。我能想到两个:
您可以像这样创建一个稀疏向量:
A = spalloc(500000*60*60, 1, 100);
其中最后一个条目 ( 100
) 是指最终分配给 的非零的数量A
。如果您事先知道这个数量,它会提高内存使用A
效率。如果您事先不知道它,只需使用接近它的一些数字,它仍然可以工作,但最终A
会消耗比它严格需要的更多的内存。
然后你可以像这样引用元素,就好像它是一个 3D 数组:
A(sub2ind(size(A), i,j,k))
其中i
和分别是第 1、第 2j
和k
第 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
和分别是第 1、第 2j
和k
第 3 维的索引。
由于您的矩阵是稀疏的,请尝试使用ndsparse(N 维稀疏数组 FEX)