降低基于本本的模板
reduction of eigen based templates
我正在尝试基于特征矩阵进行减少。
#include <iostream>
#include <Eigen/Dense>
#include <type_traits>
template<typename T1, typename T2, int n1, int n2>
auto reduction(Eigen::Matrix<T1, n1, n2> &a1,
Eigen::Matrix<T2, n1, n2> &a2)
-> decltype(T1{}*T2{})
{
using BaseT3 =
typename std::remove_cv<typename std::remove_reference<decltype(T1{}*T2{})>::type>::type;
BaseT3 res = a1(0, 0)*a2(0, 0);
for (int i=0; i<n1; ++i)
for (int j=0; j<n2; ++j)
if (i+j)
res = res + a1(i, j)*a2(i, j);
return res;
}
int main()
{
Eigen::Matrix<double, 3, 3> m;
Eigen::Matrix<Eigen::Vector3d, 3, 3> n;
std::cout << reduction(m, n) << std::endl;
}
基本上,我试图获得sum_{i, j} a1[i, j] * a2[i, j]
,其中a1
和a2
是一些特征Mathix,但我会遇到编译错误。我得到的错误是
error: no match for ‘operator=’ (operand types are ‘BaseT3 {aka
Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<double>,
const Eigen::Matrix<double, 3, 1> >}’
and
‘const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<double>,
const Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<double>,
const Eigen::Matrix<double, 3, 1> >,
const Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<double>,
const Eigen::Matrix<double, 3, 1> > >’)
res = res + a1(i, j)*a2(i, j);
^
如果我没记错的话,对于给定的main
,类型BaseT3
应该是Eigen::Vector3d
。我也尝试静态铸造,以便operator=
不应该失败,但我会遇到其他错误。
这是C 11,我使用eigen3,编译器为G 5.4.1。
t1 * t2的声明不是您在这里期望的 - eigen大量使用表达模板。您错误中的cwiseunaryop和cwiseBinaryOp类型表示这表示。换句话说," double * vector3d"的结果不是您所期望的(这不是vector3d,它是cwisebinaryop(。
另请参见:写入本特征类型的写作功能。
在这种特定情况下,您可以通过为模板函数的第一个和第二个参数的特征基础类型创建部分专业。
eigen使用表达模板来优化操作链。
so matrixa*matrixb是不是矩阵类型,而是一种表达式,说"当评估时,这将是矩阵的乘积,times a atrixb"。
结果是 A*B+C*D
并未创建(至少很多(临时矩阵,但是当存储在输出矩阵中时,结果"懒惰"直接计算到输出矩阵中。
现在,您是在增加元素。但是您的元素类型之一依次是矩阵。eigen确实对标量矢量进行了表达模板优化。
您想要的类型是std::decay_t<decltype((T1{}+T2{}).eval())>
(嗯,c 11详细版本(。
您可以写一个花哨的sfinae东西,以检查是否可以评估它,如果这样做。或者您可以测试特征表达模板类型。
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- c++r值引用应用于函数指针
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如何仅使用对象名称打印特定于对象的成员
- 相当于LocaleMatcher的ICU4C
- 等<thing>效于char32_t
- 类似于strcat()的函数出现问题
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 算术运算的结果类似于:C浮点变量中的1/3
- 相当于 pybind11 中的 boost::p ython py::scope().attr()
- 如何将记忆应用于此递归函数?
- 对对应于矩阵的行和列的对向量进行排序
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- createFile() 和 DeviceIoControl() 等效于 Unix/Linux 中的卷设备
- 为什么内存屏障依赖于变量?
- 为什么我的变量存在于其范围之外
- 如何修复我的最大公约数代码?它适用于除零和零以外的所有数字