Matlab 3D矩阵

7

我需要创建一个非常大的三维矩阵(例如:500000x60x60)。有没有办法在matlab中实现这个?

当我尝试时,

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

我遇到了一个内存溢出错误。

sparse函数不是一个选项,因为它只适用于2D矩阵。那么是否有更高维度矩阵的替代方法呢?


1
欢迎来到 Stack Overflow,请通过编辑您的问题向我们展示您做了什么。 - Axel Isouard
使用 sparse 命令创建稀疏矩阵。 - Andrey Rubshtein
请描述一下为什么您无法创建这个矩阵。同时,请告诉我们您的矩阵是否是稀疏矩阵。 - Oli
我的矩阵是稀疏的。但问题在于,当维数高于2时,我找不到如何在matlab中创建稀疏矩阵的方法。正如我之前所说,安德烈,我的问题出现了“内存不足”的错误。这就是为什么我无法创建这个矩阵的原因。 - Scipion
1
我认为你正在寻找一个稀疏张量。请查看这个问题的答案 - cjh
2个回答

8

Matlab 只支持稀疏矩阵 (2D)。对于3D张量/数组,您需要使用一些变通方法。我能想到两种方法:

  1. 线性索引
  2. cell数组

线性索引

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

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

最后一个条目(100)指的是最终要分配给A的非零数量。如果您事先知道此数量,则可以使A的内存使用更加高效。如果您不知道它,请使用接近此数量的某个数字,它仍将起作用,但A最终可能会比严格需要的内存消耗更多。

然后,您可以像处理3D数组一样引用元素:

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

其中ijk分别是第一、二、三维的索引。

单元数组

将3D张量/数组中的每个2D页面创建为一个单元数组:

a = cellfun(@(x) spalloc(500000, 60, 100), cell(60,1), 'UniformOutput', false);

同样的故事也适用于这个最后一个 spalloc 条目。然后像这样在三维中连接:
A = cat(3, a{:});

然后,您可以这样引用单独的元素:
A{i,j,k}

其中ijk分别是第1、2、3维的索引。


6

由于你的矩阵是稀疏的,建议使用 ndsparse (N维稀疏数组FEX)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接