J'ai une matrice qui est une représentation d'un tenseur de dimension supérieure qui pourrait en principe être à N dimensions, mais chaque dimension a la même taille. Disons que je veux calculer ce qui suit :
et C est stocké sous forme de matrice via
où il existe une correspondance entre ij et I et kl et J.
Je peux le faire avec des boucles for imbriquées où chaque dimension de mon tenseur a une taille de 3 via
for (int i=0; i<3; i++){
for (int j=0; j<3; j++){
I = map_ij_to_I(i,j);
for (int k=0; k<3; k++){
for (int l=0; l<3; l++){
J = map_kl_to_J(k,l);
D(I,J) = 0.;
for (int m=0; m<3; m++){
for (int n=0; n<3; n++){
M = map_mn_to_M(m,n);
D(I,J) += a(i,m)*C(M,J)*b(j,n);
}
}
}
}
}
}
mais c'est plutôt désordonné et pas très efficace. J'utilise la bibliothèque de la matrice d'Eigen et je pense qu'il existe probablement un meilleur moyen de faire cela qu'une boucle for ou le codage de chaque entrée séparément. J'ai essayé la bibliothèque tensorielle non supportée et j'ai trouvé qu'elle était plus lente que mes boucles explicites. Avez-vous des idées ?
En guise de question bonus, comment pourrais-je calculer efficacement quelque chose comme ce qui suit ?