我正在开发一个自定义库.到目前为止,我已将std :: tuple和std :: tie包装到我自己的myOwn :: Tuple和myOwn :: tie中.它们的功能与std :: tuple和std :: tie相同.我想用std :: ignore做类似的事情.
到目前为止,我写了以下内容:
namespace myOwn
{
auto
tilde()
-> decltype(std::ignore)
{
return std::ignore;
}
}
Run Code Online (Sandbox Code Playgroud)
我唯一的问题是我现在必须使用带圆括号的myOwn :: tilde().我希望能够将其用作myOwn :: tilde.到目前为止,我在std :: ignore上读到的只是如何使用它,
在这里:C++:使用std :: ignore返回std :: tie的类型
我试过用了
typedef std::ignore tilde
Run Code Online (Sandbox Code Playgroud)
但这没有成功.任何帮助,将不胜感激.这个问题可能对试图包装对象的其他人有用.
我希望这个讨论可以帮助其他任何与Armadillo和Eigen3有关的人.
我编写了一个包装类Mat,它包含来自armadillo库的arma :: Mat或来自Eigen3库的Eigen :: Matrix.这在编译时用标志控制.
另外,我写了一个使用Mat作为存储的Tensor类.此类的主要特征是使用Voigt表示法来压缩高阶张量,以便正确存储在矩阵中.
最后,我编写了一个多次乘以二阶张量(即矩阵)和一阶张量(即矢量)的测试,并记录完成运算符所需的时间.我用Mat类和Tensor类来做这个.
因为Tensor包裹Mat,我希望它的时间更长.犰狳就是这种情况,平均接近20%.然而,当使用Eigen时,使用Tensor更快,这对我来说绝对没有意义.
有什么事情适合任何人吗?
编辑:提供更多细节.
我首先将arma :: Mat包装成myOwn :: armaMat,将Eigen :: Matrix包装到myOwn :: eigenMat中.这两个都只是将armadillo和Eigen的API包装到一个通用框架中.最后,基于编译器标志,myOwn :: Mat包装了一个armaMat或一个eigenMat.我不确定我们打开的任何优化标志.
如上所述,myOwn :: Tensor使用myOwn :: Mat作为存储.由于我将使用Tensor类的物理应用程序,它被模板化为2D(即如果是2阶的2乘2)或3D(即3乘3).(相比之下,垫可以是任何尺寸).
我用于定时目的的运算符是:2乘2矩阵(二阶张量)乘以2乘1矩阵(一阶张量).当只使用Mat时,我基本上使用的是犰狳或Eigen的表达式模板.
使用我的Tensor类时,我正在重载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;
}
Run Code Online (Sandbox Code Playgroud)
Tensor上的[]运算符从底层存储Mat访问数据(通过Voigt约定).