【问题标题】:Matlab 3d-matrixMatlab 3d矩阵
【发布时间】:2012-09-28 15:50:45
【问题描述】:

我必须创建一个非常大的 3D 矩阵(例如:500000x60x60)。 matlab有什么办法吗?

当我尝试时

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

我收到 out-of-memory 错误。

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

【问题讨论】:

  • 欢迎来到 Stack Overflow,请通过编辑问题向我们展示您所做的工作。
  • 使用sparse命令创建稀疏矩阵
  • 请描述您无法创建此矩阵的原因。另外,请告诉我们您的矩阵是否稀疏。
  • 我的矩阵是稀疏的。但关键是,当维度高于 2 时,我没有找到如何在 matlab 中创建稀疏矩阵。Andrey,正如我之前所说,我的问题来自“内存不足”错误。这就是为什么我无法创建这个矩阵的原因。
  • 我认为您正在寻找稀疏张量。看看this question的答案。

标签: matlab sparse-matrix


【解决方案1】:

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

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

线性索引

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

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 维的索引。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2013-09-21
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多