【问题标题】:Reshape 3d matrix to 2d matrix将 3d 矩阵重塑为 2d 矩阵
【发布时间】:2011-01-16 10:45:25
【问题描述】:

我在 MATLAB 中有一个 3d 矩阵 (n-by-m-by-t),表示一段时间内网格中的n-by-m 测量值。我想要一个二维矩阵,其中空间信息消失了,只剩下n*m 随时间推移的测量值t(即:n*m-by-t

我该怎么做?

【问题讨论】:

    标签: matlab matrix reshape


    【解决方案1】:

    你需要命令reshape:

    假设你的初始矩阵是(仅供我获取一些数据):

    a=rand(4,6,8);
    

    那么,如果最后两个坐标是空间坐标(时间为 4,m 为 6,n 为 8),您使用:

    a=reshape(a,[4 48]);
    

    你最终得到一个 4x48 数组。

    如果前两个是空间的,最后一个是时间(m 是 4,n 是 6,时间是 8)你使用:​​

    a=reshape(a,[24 8]);
    

    你最终得到一个 24x8 数组。

    这是一个快速的 O(1) 操作(它只是调整数据形状的标题)。还有其他方法可以做到这一点,例如a=a(:,:) 压缩最后两个维度,但 reshape 更快。

    【讨论】:

      【解决方案2】:

      重塑当然是重塑数组的标准解决方案。 (他们还会怎么称呼它?)还有一些技巧需要发现。

      首先,最简单的方法是将大小为 [n,m,p] 的数组转换为大小为 [n*m,p] 的数组?

      B = reshape(A,n*m,p);
      

      但更好的是:

      B = reshape(A,[],p);
      

      如果您将 reshape 的参数之一留空,那么 reshape 会为您计算大小!小心,如果你尝试这个并且 A 的大小不符合,那么你会得到一个错误。因此:

      reshape(magic(3),[],2)
      ??? Error using ==> reshape
      Product of known dimensions, 2, not divisible into total number of elements, 9.
      

      从逻辑上讲,我们不能从包含 9 个元素的东西中创建一个包含两列的数组。我确实在 MATLAB Central 交换器上放置了一个名为 wreshape 的函数,它会根据需要填充以执行此操作而不会产生错误。

      当然,你总是可以使用类似的技巧

      B = A(:);
      

      直接从矩阵创建向量。这相当于表格

      B=reshape(A,[],1);
      

      【讨论】:

        【解决方案3】:

        此问题的更好解决方案是使用 Rasmus Bro 的 N-Way 工具箱中提供的 nshape.m。这将允许您沿着给定的模式重塑,这对于重塑命令来说有点棘手。

        工具箱可在以下链接获得:

        https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox

        还有其他一些出色的工具可以帮助进行数组操作。

        【讨论】:

          猜你喜欢
          • 2016-11-08
          • 1970-01-01
          • 1970-01-01
          • 2021-09-14
          • 2012-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多