1

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

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

A=魔法(10)

一个=

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 等)。

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

谢谢你的帮助!拉斯穆斯

4

3 回答 3

11

这是你想要的:

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

?

于 2012-04-13T10:43:46.053 回答
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是“组”的大小(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

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

于 2012-04-13T11:17:20.707 回答
0

执行此操作的简单方法:

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)=[];
于 2014-01-30T10:01:17.850 回答