2017-03-17 7 views
1

reihenweisen Matrix mit dem Vektor in Matlab zu vergleichen, habe ich eine Matrix A in Matlab der Dimension MxN und zwei Zeilenvektoren B und D der Dimension 1xN. Ich würde gerne den schnellsten Weg zum Vergleich B mit jeder Zeile von A wissen. Alle Elemente sind 1 oder 0.schnelle Weise

Spezifisch

A=[ 1  1  1; 
    1  1  0; 
    1  0  1; 
    1  0  0; 
    0  1  1; 
    0  1  0; 
    0  0  1; 
    0  0  0]; 



    B=[1 1 1]; 
    D=[1 0 0] 

Ich möchte, um eine Matrix der Dimension C konstruieren Mx1 mit C(i)=1 wenn

B(1,1)>=A(i,1) und B(1,2)>=A(i,2) und ... B(1,N)>=A(i,N) und

D(1,1)<=A(i,1) und D(1,2)<=A(i,2) ... und D(1,N)<=A(i,N) und

B(:) unterscheidet sich von A(i,:) und

D(:) unterscheidet sich von A(i,:)

Im Beispiel

C=[0;1;1;0;0;0;0;0]; 

Eine Möglichkeit, dies zu tun

lownew=repmat(D,size(A,1),1); 

greatnew=repmat(B,size(A,1),1); 

C=(sum(lownew<=A,2)==N & sum(greatnew>=A,2)==N & sum(lownew==A,2)~=N & sum(greatnew==A,2)~=N); 

Gibt es eine schnellere Möglichkeit sein könnte ? Meine reale Matrix A hat eine Dimension größer als 10^6.

Antwort

0

Sicher, der schnellste Weg (in Anzahl der Codezeilen und Rechenzeit) ist sicher bsxfun zu verwenden.

In Ihrem Fall:

tmp = bsxfun(@ge, A, B); 
res = all(tmp,2); 

ist das, was Sie suchen. Beachten Sie, dass bsxfun automatisch Eingaben unterschiedlicher Größe verarbeitet, wie in Ihrem Beispiel, so dass hier keine repmat oder Matrixmultiplikation benötigt wird.

bearbeiten

Gleiche Idee mit den neuen Beschränkungen. Beachten Sie, dass a<=b und a~=b vereinfacht in a<b:

tmp = bsxfun(@lt, A, B) && bsxfun(@lt, D, A); 
res = all(tmp,2); 
+0

Danke, ich habe ein bisschen mehr meine Frage erarbeitet. Könnten Sie einen Blick darauf werfen? – user3285148

+1

Hey, ändere die Frage nicht so nach einer Antwort. Bitte stellen Sie stattdessen eine andere Frage. Ich werde meine Antwort trotzdem bearbeiten. – Ratbert

Verwandte Themen