2016-11-08 1 views
2

Ich habe ein Array in Matlab, z.B.Wie in Matlab der Mindestwert jeder Zeile (oder Spalte) in Array festlegen?

a=rand([3,3]) 
a = 

0.8308 0.9172 0.7537 
0.5853 0.2858 0.3804 
0.5497 0.7572 0.5678 

Und jetzt, würde Ich mag den Minimalwert jeder Zeile auf 0 Das Ergebnis sollte setzen:

a = 

0.8308 0.9172 0 
0.5853 0   0.3804 
0   0.7572 0.5678 

Ich habe keine Ahnung, wie man für diese [Y,I]=min(a,[],2) Funktion verwenden. Vielen Dank.

Antwort

3

Wie Sie gesagt haben, Sie den Spaltenindex der Minimalwert jeder Zeile bekommen

[~, col] = min(a, [], 2); 

Jetzt verwenden Sie sub2ind können die Einträge auf Null zu setzen:

a(sub2ind(size(a), 1:size(a,1), col.')) = 0; 

können Sie Spielen Sie mit ihm auf ideone.

+0

Fehler: Unsymmetrische oder unerwartete Klammer oder Klammer. Ich lösche die letzte Klammer, aber immer noch nicht. –

+0

@IvoVertat Ich korrigierte den Tippfehler. Bitte versuchen Sie es erneut – Shai

+0

Fehler bei der Verwendung von sub2ind Die tiefgestellten Vektoren müssen alle von der gleichen Größe sein. Funktioniert immer noch nicht. –

0

Eine ineffiziente Methode wäre, jede Zeile durchzulaufen und den Befehl find zu verwenden, um alle Minima in einer bestimmten Zeile zu finden.

n = 10; 
A = rand(n,n);  
for ii = 1:n 
ind = find(A(ii,:) == min(A(ii,:))); 
A(ii,ind) = 0; 
end 

Wenn mehrere Minima vorhanden sind, werden alle auf Null gesetzt.

Hoffe, das hilft.

+1

keine Notwendigkeit für Schleife. besser logisches Indexieren anstelle von 'find' verwenden. – user2469775

+1

Diese Arbeit. Danke –

2

Wenn Sie Bedenken über mehrere Minima in der gleichen Reihe sind:

row_min = min(a, [], 2); 
a(bsxfun(@eq, row_min, a)) = 0; 

keine Schleifen benötigt werden (im Gegensatz zu Matt T's Antwort entgegengesetzt).

+0

Es funktioniert gut und einfach für mehrdimensionale Array zu erweitern. Vielen Dank –

Verwandte Themen