У меня есть Матрица, представляющая тензор более высокого измерения, который в принципе может быть N-мерным, но каждый размер имеет одинаковый размер. Допустим, я хочу вычислить следующее:
![eqn1](https://latex.codecogs.com/gif.latex?D_%7Bijkl%7D%20%3D%20%5Csum_%7Bm%3D0%7D%5E%7BN_m%7D%20%5Csum_%7Bn%3D0%7D%5E%7BN_n%7Da_%7Bim%7D%20C_%7Bmnkl%7D%20b_%7Bjn%7D)
и C сохраняются в виде матрицы через
![eqn2](https://latex.codecogs.com/gif.latex?%5Cleft%5BC%20%5Cright%20%5D_%7BIJ%7D%20%3D%20C_%7B%5C%7Bij%5C%7D%5C%7Bkl%5C%7D%7D)
, где есть некоторое отображение от ij до I и kl до J.
Я могу сделать это с помощью вложенных циклов for, где каждое измерение моего тензора имеет размер 3 через
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);
}
}
}
}
}
}
но это довольно грязно и не очень эффективно. Я использую матричную библиотеку Eigen, так что я подозреваю, что, вероятно, есть гораздо лучший способ сделать это, чем цикл for или кодирование каждой записи отдельно. Я попробовал неподдерживаемую тензорную библиотеку и обнаружил, что она медленнее, чем мои явные циклы. Есть мысли?
В качестве дополнительного вопроса, как бы я эффективно вычислил что-то вроде следующего?
![eqn3](https://latex.codecogs.com/gif.latex?D_%7Bijkl%7D%20%3D%20%5Csum_%7Bm%3D0%7D%5E%7BN_m%7D%20%5Csum_%7Bn%3D0%7D%5E%7BN_n%7D%20a_%7Bkm%7DC_%7Bimnj%7D%20b_%7Bnl%7D)