2012-04-13 55 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)=[];