2017-02-21 3 views
1

Angesichts einer 12 x 13 Matrix in Matlab, muss ich die Zeile mit dem größten Wert in Spalte 9 alle zwei Zeilen auswählen und eine Matrix erstellen, die die ausgewählten Zeilen enthält. Das folgende Stück Code macht den Job, aber ich frage mich, wie diese Syntax verbessert und verkürzt werden könnte.Wie kann die folgende Syntax gekürzt und verbessert werden?

A = rand(12,13); 

a = A(1:2,:); 
if a(1,9) > a(2,9) 
    a = A(1,:); 
else 
    a = A(2,:); 
end 

b = A(3:4,:); 
if b(1,9) > b(2,9) 
    b = A(3,:); 
else 
    b = A(4,:); 
end 

c = A(5:6,:); 
if c(1,9) > c(2,9) 
    c = A(5,:); 
else 
    c = A(6,:); 
end 

d = A(7:8,:); 
if d(1,9) > d(2,9) 
    d = A(7,:); 
else 
    d = A(8,:); 
end 

e = A(9:10,:); 
if e(1,9) > e(2,9) 
    e = A(9,:); 
else 
    e = A(10,:); 
end 

f = A(11:12,:); 
if f(1,9) > f(2,9) 
    f = A(11,:); 
else 
    f = A(12,:); 
end 

SELECTED_A = [a;b;c;d;e;f]; 

Vielen Dank.

Antwort

3

Ich kann eine kürzere Lösung bieten, aber wenn Sie es vollständig vektorisiert wollen, müssen Sie auf jemanden mit ein wenig mehr Kompetenz warten. Hier ist der Code:

A=rand(12,13); 
B=zeros(6,13); % preallocate solutionarray 
for ii=2:2:12 % loop through every (second) row 
    [~,ind]=max([A(ii,9),A(ii-1,9)]); % check which element is greater 
    B(ii/2,:)=A(ii-(ind==2),:); % select corresponding row 
end 

Dies wird Ihnen ein Array B mit den Werten die Sie suchen.

EDIT: Es gab einen kleinen Fehler im Code: die Bedingung in Zeile 5 des Codes muss ind==2 sein sonst wird es immer die Zeile mit dem kleineren Eintrag in Spalte 9 wählen. Alternativ könnten Sie auch ind==1 und schalte die Elemente in Zeile 4 um zB max([A(ii-1,9),A(ii,9)])

+2

Das OP benötigt die _rows_, 'SELECTED_A' ist eine 6x13 Matrix. –

+1

@ Jørgen du hast Recht, sorry. Ich werde es korrigieren. – Max

+1

Kein Problem. 'max' gibt den Index als zweiten Rückgabewert zurück. Verwenden Sie das, um die gewünschte Zeile auszuwählen. –

Verwandte Themen