【问题标题】:MATLAB: extracting groups of columns into a submatrix?MATLAB:将列组提取到子矩阵中?
【发布时间】:2012-04-25 17:22:27
【问题描述】:

我有一个数据集,我想在其中提取第 1-3、7-9、13-15 列,一直到矩阵的末尾

作为一个例子,我使用了标准的魔法函数来创建一个矩阵

A=魔法(10)

A =

92    99     1     8    15    67    74    51    58    40
98    80     7    14    16    73    55    57    64    41
 4    81    88    20    22    54    56    63    70    47
85    87    19    21     3    60    62    69    71    28
86    93    25     2     9    61    68    75    52    34
17    24    76    83    90    42    49    26    33    65
23     5    82    89    91    48    30    32    39    66
79     6    13    95    97    29    31    38    45    72
10    12    94    96    78    35    37    44    46    53
11    18   100    77    84    36    43    50    27    59

我知道我可以使用以下命令以 3 为间隔提取从 1 开始的单列:

Aex=a(:,1 : 3 : 结束)

Aex =

92     8    74    40
98    14    55    41
 4    20    56    47
85    21    62    28
86     2    68    34
17    83    49    65
23    89    30    66
79    95    31    72
10    96    37    53
11    77    43    59

假设我想提取列组(例如列 1-3、7-9 等)。

有没有办法做到这一点,而不必手动指出所有的列号?

感谢您的帮助! 拉斯穆斯

【问题讨论】:

    标签: matlab extraction data-extraction submatrix


    【解决方案1】:

    简单的方法:

    M = magic(10);
    
    n = size(M,2)
    idx = sort([1:3:n 2:3:n 3:3:n])
    M(:,idx)
    

    但是,如果删除模式比您想要保留的列模式更简单,则可以改用它:

    A = magic(10);
    B = A;
    B(:,4:3:end)=[];
    B(:,4:3:end)=[]; %Yes 3x the same line of code.
    B(:,4:3:end)=[];
    

    【讨论】:

      【解决方案2】:

      我假设您希望将结果全部连接到另一个大矩阵中?

      如果是这种情况,试试这个尺寸:

      result = A(diag(0:2)*ones(3,floor((size(A,2) - 3)/6) + 1) + ...
                  ones(3,floor((size(A,2) - 3)/6) + 1)*diag(1:6:(size(A,2)-3)))
      

      这可能会通过一些矩阵数学规则来缩短。您还可以对这些值进行参数化,以便对其进行修改以完成比这个问题所期望的更多的事情(也可能更有意义),

      a = 3;           
      b = 6;          
      
      result = A(diag(0:a-1)*ones(a,floor((size(A,2) - a)/b) + 1) + ...
                  ones(a,floor((size(A,2) - a)/b) + 1)*diag(1:b:(size(A,2)-a)))
      

      其中a 是“组”的大小(length([1 2 3]) = length([7 8 9]) = ... = 3)等,b 是列间距(在您的示例中为[1...7...13...]

      如果您想将它们分开,我将它们放在此处的单元格中,但它们可以转到您需要的任何地方:

      a = 3;
      b = 6;
      results = {};
      for Cols = 1:b:(size(A,2)-a)
          results{end+1} = A(:, Cols:(Cols+2));
      end
      

      我没有检查其中任何一个的速度,但我认为第一个可能更快。您可能希望将其拆分为多个术语,以便更具可读性,我只是将其放在一行中(这并不总是编写代码的最佳方式)。

      【讨论】:

      • wtf ???????????? (由于 SO 对评论长度的限制,所以有这么多问号)
      • 我并没有说它不好,但我会说这是一种非常复杂的方法,它在 Matlab 中具有更简单的形式。尽我所能,与我自己的努力相比,我看不出您提出的解决方案有任何优点。我还观察到 SO 社区尚未支持您的答案。就是这样。
      • @HighPerformanceMark 我只是建议另一种方法来参数化问题,以便解决方案可以移植到其他情况。
      【解决方案3】:

      这是你要找的吗:

       Aex = A(:,[1:3 7:9])
      

      ?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        相关资源
        最近更新 更多