MATLAB:将列组提取到子矩阵中?

时间:2012-04-13 10:34:24

标签: matlab extraction data-extraction submatrix

我有一个数据集,我要在其中提取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等)。

有没有办法在不必手动指出所有列号的情况下执行此操作?

感谢您的帮助! 拉斯穆斯

3 个答案:

答案 0 :(得分:11)

这就是你要找的东西:

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

答案 1 :(得分:0)

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

如果是这种情况,请尝试使用此尺寸:

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是“group”(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

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

答案 2 :(得分:0)

执行此操作的简单方法:

M = magic(10);

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

但是,如果删除模式比您希望保留的colums模式更简单,则可以使用它:

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