【问题标题】:using Matlab to reshape a 4d matrix into a cell array of vectors使用 Matlab 将 4d 矩阵重塑为向量元胞数组
【发布时间】:2016-11-02 20:21:32
【问题描述】:

我有一个 4D 矩阵 (dims - x,y,z,t)。我想将其重塑为长度为x*y*z 的一维元胞数组,其中每个元素都是一个大小为t 的长向量,它捕获每个卷位置(x,y,z) 的所有元素。之后我需要重新塑造它。

我想在数组上循环来做这件事,因为我真的找不到一个内置函数来做。

任何见解都会非常有帮助!谢谢!

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    看看这是不是你想要的:

    x = randn(2,3,4,5); % example data
    x = reshape(x, [], size(x,4)); % collapse first three dimensions
    x = mat2cell(x, ones(1,size(x,1)), size(x,2)); % split first dimension into cells
    

    【讨论】:

      【解决方案2】:

      Luis 的答案非常适合半矢量化(mat2cell 使用循环)。如果您想要的是大小为x*y*z 的单元阵列,其中每个元素的长度为t,则可以在每个卷位置上使用循环并提取“暂时”占据4D 中该位置的t 元素。确保您 squeeze 排除任何单一维度以获得结果向量。如果您想采用循环方法,则需要考虑这一点。假设您的矩阵名为 A,请尝试以下操作:

      B = cell(size(A,1)*size(A,2)*size(A,3), 1);
      count = 1;
      for ii = 1 : size(A,1) 
          for jj = 1 : size(A,2)
              for kk = 1 : size(A,3)
                  B{count} = squeeze(A(ii,jj,kk,:));
                  count = count + 1;
              end
          end
      end
      

      要将其恢复为 4D 矩阵形式,您只需应用相同的逻辑但相反:

      Ar = zeros(size(A));
      count = 1;
      for ii = 1 : size(A,1) 
          for jj = 1 : size(A,2)
              for kk = 1 : size(A,3)
                  Ar(ii,jj,kk,:) = B{count};
                  count = count + 1;
              end
          end
      end
      

      【讨论】:

      • 心理学家,嗯? :-)
      • @LuisMendo 我会这么说 :) 我对这个问题所做的编辑是我如何解释这个问题......“长向量”和“单元格”显然不会在一起。
      • @LuisMendo 你是对的。我解释错了。我需要编辑。
      【解决方案3】:

      类似于 Luis 的解决方案,但更简单、更完整:

      % Transform to cell
      x = randn(2,3,4,5); % example data
      y = reshape(x, [], size(x,4));
      z = num2cell(y,2);
      
      % transform back 
      x = reshape(cat(1,z{:}), size(x));
      

      【讨论】:

      • 非常好。您可以通过将reshape 的第二个参数设为size(x) 来简化重新塑造回4D。胜过输入所有这些数字!
      • 干得好!我一直忘记num2cell的双输入版本