2012-04-13 15 views
1

I eine Datensatz aufweisen, in dem ich will 1-3 Spalten extrahieren, 7-9, 13-15, den ganzen Weg bis zum Ende der MatrixMATLAB: Spalten von Spalten in eine Submatrix extrahieren?

Als Beispiel habe ich verwendet, die Standard magic Funktion eine Matrix

A = magic (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 

ich weiß, zu schaffen, daß ich in Intervallen von 3 mit dem Befehl einzelne Spalten extrahieren kann beginnend mit 1:

Aex = a (:, 1: 3: end)

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 

Say I Gruppen von Spalten zu extrahieren, statt (z.B. Spalte 1-3, 7-9 usw.).

Gibt es eine Möglichkeit, dies zu tun, ohne alle Spaltennummern manuell angeben zu müssen?

Danke für Ihre Hilfe! Rasmus

Antwort

11

Ist das, was Sie suchen:

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

?

0

Ich gehe davon aus, dass Sie möchten, dass das Ergebnis in einer anderen großen Matrix verkettet wird?

Wenn das der Fall ist, versuchen Sie diese ein für Größe:

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

, die wahrscheinlich mit einigen Matrix mathematische Regeln verkürzt werden konnte. Sie könnten auch die Werte parametrieren, so dass sie geändert werden können, mehr zu tun als das, was dieses Problem erwartet, (und vielleicht auch mehr Sinn machen),

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

wo a die Größe der „Gruppe“ ist (length([1 2 3]) = length([7 8 9]) = ... = 3), usw. und b ist der Säulenabstand ([1...7...13...] in Ihrem Beispiel)

Wenn man sie getrennt möchte, lege ich sie in Zellen hier, aber sie können gehen, wohin Sie brauchen:

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

I didn t überprüfen Sie die Geschwindigkeit von jedem von diesen, aber ich denke, dass der erste schneller sein kann. Vielleicht möchten Sie es in Terme aufteilen, damit es besser lesbar ist. Ich habe es einfach so gemacht, dass es in eine einzige Zeile passt (was nicht immer die beste Art ist, Code zu schreiben).

+1

wtf ???????????? (so viele Fragezeichen wegen der Begrenzung der Kommentarlänge durch SO) –

+0

@high Ist es so schlimm? –

+0

Ich habe nicht gesagt, dass es schlecht ist, aber ich würde sagen, dass es eine sehr komplizierte Art ist, etwas zu tun, das in Matlab viel einfachere Formen hat. Versuche so viel ich kann, und ich sehe keinen Vorteil in deiner vorgeschlagenen Lösung verglichen mit meinen eigenen Bemühungen. Ich beobachte auch, dass die SO-Community Ihre Antwort noch nicht beantwortet hat. Das ist alles. –

0

Der einfache Weg, dies zu tun:

M = magic(10); 

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

Wenn jedoch das Muster der Entfernung ist einfacher als das Muster von colums, die Sie könnten Sie diese behalten wollen statt:

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