2017-09-19 2 views
1

Je veux créer un n-by-n logique matrice A sur la base de deux vecteurs d'indice-n-by-1a et b, tels que le (i,j) -ième élément à A est 1 si et seulement si a(i)==b(j) .Matlab: appariement efficace des indices de ligne et de colonne dans la matrice

Une façon de faire est la suivante:

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; 

Le problème avec cette approche est qu'il devient tout à fait mémoire à forte intensité si n est grande. Je suis à la recherche d'une approche plus efficace qui ne nécessite pas la création d'énormes matrices a_mat et b_mat et est également raisonnable rapide.

Répondre

0

En raison de Implicite expension du Matlab (nécessite Matlab R2016b ou plus récent)

Vous pouvez simplement écrire:

A = a==b.'; 

BENCHMARK

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. 

En termes d'utilisation de la mémoire, les solutions 2 et 3 devraient être assez similaires. Vous pouvez également épargner votre matrice une fois que votre calcul est fait avec sparse(A) afin de réduire la taille de votre matrice A.

+0

Bon à savoir, je me demandais si l'expansion implicite fonctionne. Malheureusement, je suis toujours coincé avec 2016a pour l'instant ... – Bob

0

ok, juste trouvé la réponse moi-même, il est en fait assez trivial (pas sûr de quitter ou tout simplement supprimer la question?):

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

Pas sûr non plus. Mais vous devriez remplacer '' 'par' .'' dans le cas où les valeurs sont complexes –

+1

c'est seulement des indices (nombres naturels) dans mon cas, mais en général, oui! (bien que dans ce cas on devrait probablement spécifier une certaine tolérance pour l'appariement) – Bob