2017-09-19 2 views
1

Ich mag A eine logische n-by-n Matrix auf zwei n-by-1 Indexvektoren a und b solche auf Basis zu schaffen, dass das (i,j) -te Element in A1 ist, wenn und nur wenn a(i)==b(j) .Matlab: effiziente Anpassung von Zeilen- und Spaltenindizes in Matrix

Eine Möglichkeit, dies zu tun, ist wie folgt:

a = [1 1 2 3]'; 
    b = [2 3 1 3]'; 
    n = 4; 

    a_mat = repmat(a, [1 n]); 
    b_mat = repmat(b', [n 1]); 

    A = a_mat == b_mat; 

Das Problem bei diesem Ansatz ist, dass es recht speicherintensiv wird, wenn n groß ist. Ich bin auf der Suche nach einem effizienteren Ansatz, der keine großen a_mat und b_mat Matrizen erfordert und auch vernünftig schnell ist.

Antwort

0

Aufgrund der implicite expension der Matlab (erfordern Matlab R2016b oder neuer)

Sie können einfach schreiben:

A = a==b.'; 

BENCHMARK

012.351.
n = 20000; 
    a = randi([1,100],1,n)'; 
    b = randi([1,100],1,n)'; 
    A = zeros(n,'logical'); 

    % Solution 1 
    tic 
    a_mat = repmat(a, [1 n]); 
    b_mat = repmat(b', [n 1]); 

    A = a_mat == b_mat; 
    toc 

    % Solution 2 
    tic 
    A = bsxfun(@eq, a, b'); 
    toc 

    % Solution 3 
    tic 
    A = a==b'; 
    toc 

Elapsed time is 24.357663 seconds. 
Elapsed time is 2.497311 seconds. 
Elapsed time is 2.120866 seconds. 

In Bezug auf die Speichernutzung sollten Lösung 2 und 3 sehr ähnlich sein. Sie können Ihre Matrix auch spärlich machen, sobald Ihre Berechnung mit sparse(A) erfolgt ist, um die Größe Ihrer Matrix A zu reduzieren.

+0

Gut zu wissen, ich habe mich gefragt, ob implizite Erweiterung funktioniert. Leider stecke ich noch immer mit 2016a fest ... – Bob

0

ok, fand nur die Antwort selbst, es eigentlich ziemlich trivial ist (nicht sicher, ob die Frage verlassen oder löschen Sie einfach?):

A = bsxfun(@eq, a, b'); 
+0

Nicht sicher auch nicht. Aber Sie sollten '' 'durch' .'ersetzen, wenn die Werte komplex sind –

+1

es ist nur Indizes (natürliche Zahlen) in meinem Fall, aber im Allgemeinen, ja! (obwohl in diesem Fall sollte man wahrscheinlich eine Toleranz für die Anpassung angeben) – Bob

Verwandte Themen