Je voudrais remplacer une séquence de matrices dans mon code par un seul 3-D Eigen::Tensor. Dans cette optique, j'essaie de comparer les performances de Tensor et de Matrix.
La fonction "tensorContractTest" ci-dessous effectue une contraction d'un tenseur de rang 3 (n,n,n) avec un tenseur de rang 1 de taille n (n = 500). Cette contraction calcule n**2 produits scalaires, donc en termes du nombre d'opérations, c'est équivalent à la multiplication de deux matrices (n,n) (fonction "matrixProductTest" ci-dessous).
En exécutant sur Visual Studio 2013, la fonction "tensorContractTest" s'exécute environ 40 fois plus lentement que "matrixProductTest". Probablement, je fais une erreur quelque part. Votre aide est appréciée.
#include
using namespace Eigen;
// Contrat un tenseur 3D (n x n x n) avec un tenseur 1D (n).
// En nombre d'opérations, c'est équivalent à la multiplication
// de deux matrices (n, n) (matrixProdTest).
Tensor tensorContractTest(int n)
{
Tensor a(n, n, n); a.setConstant(1.);
Tensor b(n); b.setConstant(1.);
auto indexPair = array, 1>{IndexPair(2,0)};
Tensor result = a.contract(b, indexPair);
return result;
}
MatrixXd matrixProductTest(int n)
{
MatrixXd a = MatrixXd::Ones(n, n), result = a * a;
return result;
}