5 Stimmen

Indexierung in Vektor

Kann mir bitte jemand erklären, warum im Beispiel A das Ergebnis ein 1x6-Vektor ist (was Sinn macht und was ich erwartet habe), während im Beispiel B das Ergebnis ein 1x4-Vektor ist?

Im Beispiel B, wenn ich die Größe von newvec auf einen 1x6-Vektor vordefiniere, dann ist das Ergebnis der korrekte 1x6-Vektor. Verstehe nur nicht, was passiert.

Beispiel A

vec = [0 2 3 0 5 0]     %1x6
newvec(vec == 0) = 1    %ergibt einen 1 x 6 Vektor

Beispiel B

vec = [0 2 3 0 5 3]     %1 x 6
newvec(vec == 0) = 1    %ergibt einen 1 x 4 Vektor

4voto

Rody Oldenhuis Punkte 37526

Warum, werden wir nie wissen. Es ist eine Designentscheidung von The MathWorks, und meiner bescheidenen Meinung nach verstößt es tatsächlich gegen das Prinzip der geringsten Überraschung.

Es riecht ein wenig nach früher Optimierung (in Bezug auf den RAM-Verbrauch) und/oder dass die Interna von MATLAB einen Aufruf an find vor der Zuweisung machen oder so ähnlich. Aber es ist wirklich nur eine Vermutung.

Ein häufigerer Weg, um das zu tun, was Sie wollen, ist dieser:

newvec = (vec == 0);

4voto

nkjt Punkte 7815

Wenn newvec nicht existiert, wenn Sie die zweite Zeile aufrufen, macht MATLAB es nur so groß, wie es sein muss, um die Indizes zu halten, die Sie auf 1 setzen.

Was Sie tatsächlich tun, ist:

newvec([1 4 6]) = 1; oder

newvec([1 4]) = 1;

Ähnlich, wenn vec tatsächlich eine 2D/3D etc. Matrix war, wird newvec als 1 x N herauskommen, wobei N der höchste Index ist und nicht die Form der ursprünglichen Matrix beibehalten wird.

Also, in diesen Fällen müssen Sie entweder:

1) newvec zuerst auf die Größe von vec vorbereiten.

2) Führen Sie stattdessen newvec = (vec==0) aus

3voto

Nishant Punkte 2541

BEARBEITEN: Danke an Dan für das Auffinden des Fehlers.

vec == 0 erzeugt eine logische Matrix. Wenn nun die Größe von newvec nicht definiert ist, dann wird newvec(vec==0) =1 immer einen neuen Zeilenvektor newvec erstellen.

Die folgenden Schritte werden die Größe dieses newvec bestimmen

temp1 = logical_matrix(:);
trailing_zeros = Anzahl der Nullen nach dem Auftreten des letzten `true` Werts in temp1
size(newvec) = [1, numel(logical_matrix) - trailing_zeros] ;

Wenn Sie die Größe von newvec vorher festlegen, dann kann newvec(v==0) = 1 die Größe von newvec nicht ändern, es weist nur 1 den entsprechenden Indizes zu, für die vec==0 true ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X