2012-01-10 6 views
2

J'ai deux matrices dans MATLAB, A de taille n x m et B de taille n x m ainsi. Je veux créer une nouvelle matrice C qui est quelque chose comme:Comment calculer un produit externe rapide dans MATLAB?

for i = 1:n 
    C = C + outerProduct(A(i,:), B(i,:)); 
end 

à savoir C est une matrice de taille m x m, la somme de tous les produits externes des rangées de A et B. Existe-t-il un moyen rapide de le faire sans boucle for? Pour les boucles sont notoirement lent dans MATLAB.

Répondre

3

L'opération que vous effectuez (la somme des lignes de produits extérieurs) est équivalente à la multiplication d'une version transposée de A avec B:

C = A.'*B; 

Vous pouvez voir cela en utilisant l'exemple suivant:

>> mat = magic(5); %# A sample 5-by-5 matrix 
>> A = mat(1:4,:); %# Create a 4-by-5 matrix 
>> B = mat(2:5,:); %# Create another 4-by-5 matrix 

>> C = zeros(5); %# Initialize C to be 5-by-5 
>> for i = 1:4, C = C + A(i,:).'*B(i,:); end; %'# Calculate C as you are now 

>> isequal(C, A.'*B) %'# Test for equality with the shorter solution 

ans = 

    1 %# Equal! 
+0

Non, ce ne serait pas le cas - cela utilise le produit interne pour chaque cellule. – kloop

+2

$ C_ {ij} = \ sum_k A_ {ki} B_ {kj} = \ sum_k A^T_ {ik} B_ {kj} = A^T * B – Nzbuu

+0

En fait, je pense que c'est correct. Merci. – kloop

3

Avez-vous profilé votre code de boucle for et l'avez trouvé trop lent? Si ce n'est pas le cas, faites-le avant de passer trop de temps à s'interroger sur la pénalité de la boucle.

Votre boucle for n'est pas particulièrement mauvaise car vous bouclez seulement n fois, mais faites O(n*m) chaque boucle. Puisque vous faites beaucoup de travail à chaque itération, la pénalité de boucle ne frappe pas aussi fort. Les situations vraiment mauvaises sont des boucles imbriquées, par ex. si vous avez également calculé les produits externes avec des boucles for imbriquées.

2

peut-être que je suis malentendu, mais je crois que ce que vous recherchez est

c = a * b ';

+0

Cela produirait un résultat n-by-n, pas un résultat m-by-m. – gnovice

Questions connexes