Eigen::Matrix 中的模板重载运算符
Template overloaded operator in Eigen::Matrix
我得到了这个基本代码:
#include <iostream>
#include <Eigen/Dense>
using T12 = Eigen::Matrix<double, 2, 1>;
using T22 = Eigen::Matrix<double, 2, 2>;
template <typename Der1, typename Der2> T22
operator^ (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}
void testT12DyadT12 () {
T12 t12_1, t12_2;
t12_1 << 2.0, 3.0; t12_2 << 1.5, 2.5;
const double c1{2.0}, c2{0.5};
T22 t22_1 = c1*t12_1 ^ t12_2*c2;
std::cout << t22_1 << "\n";
}
int main () {
testT12DyadT12();
//testT1nDyadT1n ();
return 0;
}
这有效并产生正确的 2 x 2
矩阵输出。现在我想将矩阵中的行数和列数模板化为
template<int nc>
using T1n = Eigen::Matrix<double, nc, 1>;
template<int nc>
using T2n = Eigen::Matrix<double, nc, nc>;
template <int nc, typename Der1, typename Der2> T2n<nc>
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}
void testT1nDyadT1n () {
T1n<2> t12_1, t12_2;
t12_1 << 2.0, 3.0; t12_2 << 1.5, 2.5;
T2n<2> t22_1 = t12_1 & t12_2;
std::cout << t22_1 << "\n";
}
但是它给出了这个编译器错误:
error: invalid operands to binary expression ('T1n<2>' (aka 'Eigen::Matrix<double, 2, 1, 0, 2, 1>') and 'T1n<2>')
T2n<2> t22_1 = t12_1 & t12_2;
~~~~~ ^ ~~~~~
note: candidate template ignored: couldn't infer template argument 'nc'
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der1>& d2) {
^
我理解错误消息(编译器无法推断模板 arg)。 我该如何解决这个问题?我尝试将 args 作为 const Der1&, const Der2&
传递给操作员,但无济于事。我确定这是愚蠢的……我没有理解或注意过。最终我的目标是模板化 Eigen 标量类型:template< typename T, int nc > using T1n = Eigen::Matrix<T, nc, 1>;
等,并重载 operator^
.
您可以从 Der1::RowsAtCompileTime
:
导出 return 类型的大小
template <typename Der1, typename Der2>
T2n<Der1::RowsAtCompileTime>
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}
或完全通用(假设 Der1
和 Der2
具有相同的标量类型):
template <typename Der1, typename Der2>
Eigen::Matrix<typename Der1::Scalar, Der1::RowsAtCompileTime, Der2::RowsAtCompileTime>
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}
对于 C++14,你当然可以 return auto
(这将 return 一个惰性表达式,它可能是也可能不是你所期望的):
template <typename Der1, typename Der2>
auto
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}
我得到了这个基本代码:
#include <iostream>
#include <Eigen/Dense>
using T12 = Eigen::Matrix<double, 2, 1>;
using T22 = Eigen::Matrix<double, 2, 2>;
template <typename Der1, typename Der2> T22
operator^ (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}
void testT12DyadT12 () {
T12 t12_1, t12_2;
t12_1 << 2.0, 3.0; t12_2 << 1.5, 2.5;
const double c1{2.0}, c2{0.5};
T22 t22_1 = c1*t12_1 ^ t12_2*c2;
std::cout << t22_1 << "\n";
}
int main () {
testT12DyadT12();
//testT1nDyadT1n ();
return 0;
}
这有效并产生正确的 2 x 2
矩阵输出。现在我想将矩阵中的行数和列数模板化为
template<int nc>
using T1n = Eigen::Matrix<double, nc, 1>;
template<int nc>
using T2n = Eigen::Matrix<double, nc, nc>;
template <int nc, typename Der1, typename Der2> T2n<nc>
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}
void testT1nDyadT1n () {
T1n<2> t12_1, t12_2;
t12_1 << 2.0, 3.0; t12_2 << 1.5, 2.5;
T2n<2> t22_1 = t12_1 & t12_2;
std::cout << t22_1 << "\n";
}
但是它给出了这个编译器错误:
error: invalid operands to binary expression ('T1n<2>' (aka 'Eigen::Matrix<double, 2, 1, 0, 2, 1>') and 'T1n<2>')
T2n<2> t22_1 = t12_1 & t12_2;
~~~~~ ^ ~~~~~
note: candidate template ignored: couldn't infer template argument 'nc'
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der1>& d2) {
^
我理解错误消息(编译器无法推断模板 arg)。 我该如何解决这个问题?我尝试将 args 作为 const Der1&, const Der2&
传递给操作员,但无济于事。我确定这是愚蠢的……我没有理解或注意过。最终我的目标是模板化 Eigen 标量类型:template< typename T, int nc > using T1n = Eigen::Matrix<T, nc, 1>;
等,并重载 operator^
.
您可以从 Der1::RowsAtCompileTime
:
template <typename Der1, typename Der2>
T2n<Der1::RowsAtCompileTime>
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}
或完全通用(假设 Der1
和 Der2
具有相同的标量类型):
template <typename Der1, typename Der2>
Eigen::Matrix<typename Der1::Scalar, Der1::RowsAtCompileTime, Der2::RowsAtCompileTime>
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}
对于 C++14,你当然可以 return auto
(这将 return 一个惰性表达式,它可能是也可能不是你所期望的):
template <typename Der1, typename Der2>
auto
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
return d1 * d2.transpose();
}