2012-04-13 23 views
1

我有一个数据集,其中我想提取列1-3,7-9,13-15,一直到矩阵的末尾MATLAB:将组的列提取到子矩阵中?

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

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 

我知道我可以提取单个列从1开始,在与命令的3个时间间隔:

AEX =α(:,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列等)。

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

感谢您的帮助! 拉斯穆斯

回答

11

这是你在找什么:

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

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 

我没“T检查其中任何一个的速度,但我认为第一个可能会更快。您可能希望将其分解为更具可读性的术语,我只是将它做成适合单行(这并不总是编写代码的最佳方式)。

+1

wtf ???????????? (因为SO对评论长度的限制,所以有很多问号) – 2012-04-13 12:48:28

+0

@high那是不是很糟糕? – 2012-04-17 14:09:52

+0

我没有说这是坏的,但我会说这是一种非常复杂的方式,它在Matlab中做了一些简单得多的形式。尽可能努力地尝试,并且与我自己的努力相比,我看不出您提出的解决方案有什么优点。我也观察到SO社区尚未提出你的答案。就这样。 – 2012-04-18 10:21:07

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)=[];