7

我必须创建一个非常大的 3D 矩阵(例如:)500000x60x60。在matlab中有什么方法可以做到这一点吗?

当我尝试

omega = zeros(500000,60,60,'single');

我得到一个out-of-memory错误。

稀疏函数不是选项,因为它仅适用于 2D 矩阵。那么对于高维矩阵,有什么替代方法吗?

4

2 回答 2

8

Matlab 仅支持稀疏矩阵 (2D)。对于 3D 张量/数组,您必须使用一种解决方法。我能想到两个:

  1. 线性索引
  2. 元胞数组

线性索引

您可以像这样创建一个稀疏向量:

A = spalloc(500000*60*60, 1, 100); 

其中最后一个条目 ( 100) 是指最终分配给 的非零的数量A。如果您事先知道这个数量,它会提高内存使用A效率。如果您事先不知道它,只需使用接近它的一些数字,它仍然可以工作,但最终A会消耗比它严格需要的更多的内存。

然后你可以像这样引用元素,就好像它是一个 3D 数组:

A(sub2ind(size(A), i,j,k)) 

其中i和分别是第 1、第 2jk第 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、第 2jk第 3 维的索引。

于 2012-09-28T17:56:04.470 回答
6

由于您的矩阵是稀疏的,请尝试使用ndsparse(N 维稀疏数组 FEX)

于 2012-09-28T17:15:00.047 回答