2016-06-03 16 views
1

Ich versuche, logische 1 Indizes einer Matrix zu einer anderen Variablen zu exportieren, ohne ihre Position zu ändern. Unten Ich versuche, meine Zweifel mit einem Beispiel zu erklären:Exportieren von Matrix mit logischer Indexierung in Matlab

l = logical([1 0 1 1 ;... 
      1 1 1 0]); 

A = [1 2 3 4;... 
    5 6 7 8]; 

B = zeros(size(A)); 
B = A(l) 

produziert:

B = 

    1 
    5 
    6 
    3 
    7 
    4 

Aber was ich bin daran interessiert, ist

B = 

1  0  3  4 
5  6  7  0 

mir jemand helfen? Danke

Antwort

0
l = logical([1 0 1 1 ;... 
      1 1 1 0]); 

A = [1 2 3 4;... 
    5 6 7 8]; 

A .* l % element-wise multiplication 

kein Problem, du bist willkommen ;-) Akzeptiere, Frage geschlossen!

xD

EDIT

Ich fürchte, Stackoverflow eine Seite wurde, wo jeder versucht, Antworten zu schlagen anderen indem sie versuchen, eine längere und ausführlichere Antwort zu machen, auch wenn nicht im Zusammenhang, was ursprünglich GEFRAGT . Und nicht diejenigen, die eine schnelle, einfache und einfache Lösung innerhalb kurzer Zeit zu genau dieser spezifischen Frage liefern. Suever wird sofort zum Upvote, indem sie eine Frage beantwortet, die NICHT gestellt wurde, nur weil sie länger ist.

Ich werde auch das Spiel spielen und meine Antwort bearbeiten: Wenn Sie andere Standardoptionen haben wollen, dann 0, könnte man auch meine Lösung und Verwendung nehmen:

~l*default_value + A.*l 

Ich möchte nur sagen: Es Ist möglich.


EDIT2

tic; 
for i = 1:1000000 
    B = A.*l; 
end; 
toc 
>> Elapsed time is 2.18214 seconds. 

tic; 
for i = 1:1000000 
    B=zeros(size(A)); 
    B(l)=A(l); 
end; 
toc 
>>Elapsed time is 13.9691 seconds. 

für sich selbst wählen.


EDIT3 (Standardwert! = 0)

>> tic; for i = 1:1e6; B = A.*l+100*(~l); end; toc 
Elapsed time is 4.17261 seconds. 
>> tic; for i = 1:1e6; B=100*ones(size(A)); B(l)=A(l); end; toc 
Elapsed time is 14.2126 seconds. 
+1

Oooh Gott, wie könnte ich so dumm sein. :(... trotzdem danke @tim :) – pkj

+1

Ich akzeptiere die ans, aber ich erlaube den Leuten normalerweise zu antworten. – pkj

+0

@pkj: Vergessen Sie es nicht. Keine anderen Antworten werden mehr kommen. Also upvote + akzeptieren. – tim

1

Während Sie @ tim Ansatz für dieses spezielle Beispiel verwenden könnte, eine allgemeine Lösung ist die logische Array-Index zu verwenden, um sowohl die Ding, das Sie Werte von und das Array abrufen, das Sie zuweisen. Dies ergreift die Werte in A an den TRUE Positionen in I und platziert sie in den entsprechenden Positionen in B.

I = logical([1 0 1 1; 1 1 1 0]); 
A = [1 2 3 4; 5 6 7 8]; 

B = zeros(size(A)); 
B(I) = A(I); 

Das Element weise Multiplikation Ansatz wird nicht funktionieren, wenn Sie die „default“ Werte in B will nichts anderes als 0. Beispiel.

% Initialize B to an array of 100's 
B = 100 * ones(size(A)); 

% Replace the elements specified by the logical array 
B(I) = A(I); 

% 1 100  3  4 
% 5  6  7 100 

Alternativ, wenn Sie nur wollen Null-out die Werte in A können Sie auch logische Indizierung, dies zu tun verwenden.

A(~I) = 0; 

Als Nebenbemerkung, versuchen Sie es mit l für einen Variablennamen zu vermeiden, da es sehr schwierig ist l von der Anzahl 1 zu unterscheiden.

+0

hier muss man beachten, dass die Deklaration 'B = Nullen (Größe (A)) 'erforderlich ist, sonst würde man am Ende einen Vektor bekommen. Danke @Suever – pkj