【问题标题】:How to stack submatrices of a matrix to reduce dimensionality如何堆叠矩阵的子矩阵以降低维数
【发布时间】:2017-11-06 09:09:14
【问题描述】:

我找不到一个好的解决方案:

我有一个这样大小的矩阵:60x10x3

我想把它转换成这样大小的矩阵:600x3

基本上我想将 10 个尺寸为 60x3 的矩阵在第一维中彼此相邻堆叠。

如何在 matlab 中优雅地实现这一点?

【问题讨论】:

    标签: matlab matrix dimensions


    【解决方案1】:

    似乎我不明白预期的输出是什么,但这里有两种不同的方法来实现它。我添加了循环来创建不同的数字,以便研究结果。

    方法 1 - 垂直或水平堆叠

    s = zeros(60,10,3);
    for x = 1:9
        s(:,x,:) = x;
    end
    t = reshape(s, 600, 3); %vert
    u = t'; %hori
    

    方法 2 - 垂直或水平堆叠第 3 维

    s = zeros(60,10,3);
    for x = 1:9
        s(:,x,:) = x;
    end
    t = [s(:,:,1) , s(:,:,2), s(:,:,3)]; % hori
    t = [s(:,:,1) ; s(:,:,2); s(:,:,3)]; % vert
    

    希望它有所帮助,但这表明有多种方法可以在 Matlab 中实现相同的输出。确实非常强大的工具。

    【讨论】:

    • 我想我自己什至找到了一个(相当丑陋的)解决方案,这就是我问的原因,感谢您展示不同的可能性。基本上,随着时间的推移,我有 10 组 60 次测量。我将这 10 组视为独立测量。基本上 600 个数据点,因此我不需要在逻辑上将它们分开
    【解决方案2】:
    A = rand(60, 10, 3);
    B = reshape(A, [], size(A, 3));
    

    应该适用于A 的任何维度。

    【讨论】:

      【解决方案3】:

      这是一个解决方案

      堆叠[s] 10 个维度为 60x3 的矩阵在第一维度中彼此相邻。

      a = rand(60,3,10);
      % swap the 2nd and 3rd dimention
      b = permute(a,[1,3,2]);
      % condense to 2d
      c = b(:,:);
      % reshape x, y and z seperately so each group of 60 xs/ys/zs appends to the end of the previous group
      x=reshape(c(:,1:3:end),[],1);
      y=reshape(c(:,2:3:end),[],1);
      z=reshape(c(:,3:3:end),[],1);
      % condense to one 600*3 matrix
      d = [x y z];
      

      【讨论】:

        猜你喜欢
        • 2016-12-21
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-13
        • 2013-06-18
        • 1970-01-01
        • 2014-11-22
        相关资源
        最近更新 更多