Matlab三维矩阵

时间:2012-09-28 15:50:46

标签: matlab sparse-matrix

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

当我尝试

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

我收到out-of-memory错误。

稀疏函数不是选项,因为它仅适用于2D矩阵。对于更高维矩阵,还有其他选择吗?

2 个答案:

答案 0 :(得分:8)

Matlab仅支持稀疏矩阵(2D)。对于3D张量/阵列,您必须使用变通方法。我能想到两个:

  1. 线性索引
  2. cell arrays
  3. 线性索引

    您可以像这样创建稀疏矢量:

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

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

    然后你可以将元素称为像这样的3D数组:

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

    其中ijk分别是第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}
    

    其中ijk分别是第1,第2和第3维度的索引。

答案 1 :(得分:6)

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