我的希望是这个讨论可能会帮助其他人与Armadillo和Eigen3有问题。犰狳vs Eigen3定时差
我已经写了一个包装类Mat,它包装了armadillo库中的arma :: Mat或Eigen3库中的Eigen :: Matrix。这是在编译时用一个标志来控制的。
此外,我写了一个使用Mat作为存储的Tensor类。这个类的主要特征是使用Voigt符号来压缩高阶张量以正确存储在矩阵中。最后,我写了一个测试,将一个二阶张量(即矩阵)和一阶张量(即一个向量)相乘多次,并记录完成操作符所需的时间。我通过我的Mat类和Tensor类来做到这一点。
由于Tensor包裹垫,我希望它的时间更大。犰狳就是这种情况,平均接近20%。但是,使用Eigen时,使用张量更快,这对我来说毫无意义。
是否有任何东西贴到任何人?
编辑:提供更多的细节。
我已经第一次将arma :: Mat包裹到myOwn :: armaMat和Eigen :: Matrix到myOwn :: eigenMat中。这两者都将Armadillo和Eigen的API包装到一个通用框架中。最后,根据编译器标志,myOwn :: Mat包装armaMat或eigenMat。我不确定我们打开的优化标志。
如上所述,myOwn :: Tensor使用myOwn :: Mat作为存储。由于物理应用我将使用Tensor类,所以它被模板化为2D(即,如果它是二阶的2乘2)或3D(即3乘3)。 (相反,Mat可以是任何尺寸)。
我用于计时目的的操作员是:2乘2矩阵(2阶张量)乘以2乘1矩阵(1阶张量)。当仅使用Mat时,我基本上使用了犰狳或Eigen的表达模板。
当使用我的张量类,我重载operator *为这样:
template< typename T1, bool Sym >
moris::Mat<T1>
operator*(
moris::Tensor< T1, 2, 2, true > const & aTensor1,
moris::Tensor< T1, 1, 2, Sym > const & aTensor2)
{
moris::Mat<T1> tVector(2, 1);
tVector(0) = aTensor1[0]*aTensor2[0] + aTensor1[2]*aTensor2[1];
tVector(1) = aTensor1[2]*aTensor2[0] + aTensor1[1]*aTensor2[1];
return tVector;
}
上张量[]操作访问数据形成底层存储垫(通过福格特约定)。
矩阵的大小是多少?你是否在Mat和Tensor案例中将Eigen/Armidillo的矩阵矢量产品称为?另外,确保在编译器优化ON的情况下进行编译。最后,如果这些言论没有帮助发现任何问题,那么在没有看到任何代码的情况下很难提供更多的帮助。 – ggael
我已更新问题以解答您提出的一些问题。 –