2 votes

Matrice de distance de Froebenius des matrices

J'ai deux ensembles de matrices Sigma et Sigma_barre (taille : KxDxD) et je cherche à calculer la distance de Frobenius (2-Norm sur la matrice) entre ces deux ensembles, c'est-à-dire une matrice M (taille KxK) telle que

M[ i , j ] = distance entre Sigma[ i ] et Sigma_barre[ j ]

J'ai utilisé np.linalg.norm mais je ne suis pas sûr à cent pour cent qu'il fasse ce que je veux. Voici mon code naïf :

M = np.zeros((K,K))
for i in range(K):
    for j in range(K):
        M[i,j] = np.linalg.norm(sigma[i]-sigma_barre[j]) 

Ma question est donc la suivante : connaissez-vous un moyen élégant/efficace de calculer cette matrice ?

1voto

user2653663 Points 987

Vous pouvez le faire en une seule fois en ajoutant des dimensions fictives et en spécifiant l'axe sur lequel la somme doit être effectuée.

M = np.linalg.norm(sigma[:,None] - sigma_barre[None,:], axis=(2,3))

Desde sigma[:,None] - sigma_barre[None,:] est une matrice de taille KxKxDxD, ce qui peut prendre beaucoup de mémoire en fonction de la taille de K et D. Si la mémoire est un problème, votre solution semble bonne, bien que vous puissiez boucler j à partir de i+1 au lieu de cela, puisque vous savez que M[i,j] == M[j,i] et que M[i,i] == 0 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X