自己的C++铸造
Eigen c++ casting
我在使用 Eigen 库将两个矩阵相乘时遇到问题。我有以下功能。这是我想做的一个小例子:
程序名称:testMatOp.cpp
#include <iostream>
#include <Eigen/Dense>
using namespace std;
template <typename DerivedA, typename DerivedB>
void multiply(const Eigen::MatrixBase<DerivedA> &A,
const Eigen::ArrayBase<DerivedB> &B){
Eigen::MatrixXf C(2,4);
C.array() = A.array().rowwise() * B.cast<float>();
}
int main()
{
Eigen::MatrixXf A(2,4);
Eigen::MatrixXf C(2,4);
//igen::VectorXf v(4);
Eigen::Array<int,1,Eigen::Dynamic>B;
B.resize(4);
A << 1, 2, 6, 9,
3, 1, 7, 2;
B << 0,
1,
0,
0;
multiply(A,B);
}
我想通过Matrix A和Vector B相乘。我知道 Eigen 不会自动提升, B 需要转换为浮点向量才能进行乘法运算。当我编译时,出现以下编译错误
testMatOp.cpp:34:44: error: expected primary-expression before 'float'
testMatOp.cpp:34:44: error: expected ';' before 'float'
testMatOp.cpp: In instantiation of 'void multiply(const Eigen::MatrixBase<Derived>&, const Eigen::ArrayBase<DerivedB>&) [with DerivedA = Eigen::Matrix<float, -1, -1>; DerivedB = Eigen::Array<int, 1, -1>]':
testMatOp.cpp:54:15: required from here
testMatOp.cpp:34:3: error: no match for 'operator*' in '((const Eigen::DenseBase<Eigen::ArrayWrapper<const Eigen::Matrix<float, -1, -1> > >*)(&(& A)->Eigen::MatrixBase<Derived>::array<Eigen::Matrix<float, -1, -1> >()))->Eigen::DenseBase<Derived>::rowwise<Eigen::ArrayWrapper<const Eigen::Matrix<float, -1, -1> > >() * B.Eigen::ArrayBase<Derived>::cast<NewType>'
testMatOp.cpp:34:3: note: candidates are:
In file included from ../3rdparty/Eigen/Core:336:0,
from ../3rdparty/Eigen/Dense:1,
from testMatOp.cpp:26:
我可能做错了什么。我确实看过这个 post :
Cast Eigen::MatrixXd to Eigen::MatrixXf
它正确地描述了如何投射,但我无法让它适用于这个例子。
如有任何帮助,我们将不胜感激。谢谢!
-一个
由于cast()
是一个模板成员函数,在模板代码中你必须在它前面加上template
关键字:
B.template cast<float>();
B
是一个 dependent name。要访问其模板成员 cast
,您必须编写
B.template cast
C++ 是上下文相关的。当遇到 <
时,它会尝试判断它是 operator<
还是尖括号。
// std::vector is a template, so < is an angle bracket
std::vector < float >
// 3 is not a template, so < is operator<
3 < 5
但是B
的类型是const Eigen::ArrayBase<DerivedB>&
,这取决于模板参数DerivedB
。 C++ 无法决定 B.cast
是否为模板。发生这种情况时,C++ 总是猜测它不是模板并将下面的 <
解释为 operator<
.
为什么 C++ 如此 愚蠢 以至于它无法识别先前声明的模板 ArrayBase::cast
?好吧,有人可能会专攻 ArrayBase<int>
.
template<>
class ArrayBase<int>
{
public:
int cast = 3;
};
因此不能推断B.cast
是一个模板。
我在使用 Eigen 库将两个矩阵相乘时遇到问题。我有以下功能。这是我想做的一个小例子:
程序名称:testMatOp.cpp
#include <iostream>
#include <Eigen/Dense>
using namespace std;
template <typename DerivedA, typename DerivedB>
void multiply(const Eigen::MatrixBase<DerivedA> &A,
const Eigen::ArrayBase<DerivedB> &B){
Eigen::MatrixXf C(2,4);
C.array() = A.array().rowwise() * B.cast<float>();
}
int main()
{
Eigen::MatrixXf A(2,4);
Eigen::MatrixXf C(2,4);
//igen::VectorXf v(4);
Eigen::Array<int,1,Eigen::Dynamic>B;
B.resize(4);
A << 1, 2, 6, 9,
3, 1, 7, 2;
B << 0,
1,
0,
0;
multiply(A,B);
}
我想通过Matrix A和Vector B相乘。我知道 Eigen 不会自动提升, B 需要转换为浮点向量才能进行乘法运算。当我编译时,出现以下编译错误
testMatOp.cpp:34:44: error: expected primary-expression before 'float'
testMatOp.cpp:34:44: error: expected ';' before 'float'
testMatOp.cpp: In instantiation of 'void multiply(const Eigen::MatrixBase<Derived>&, const Eigen::ArrayBase<DerivedB>&) [with DerivedA = Eigen::Matrix<float, -1, -1>; DerivedB = Eigen::Array<int, 1, -1>]':
testMatOp.cpp:54:15: required from here
testMatOp.cpp:34:3: error: no match for 'operator*' in '((const Eigen::DenseBase<Eigen::ArrayWrapper<const Eigen::Matrix<float, -1, -1> > >*)(&(& A)->Eigen::MatrixBase<Derived>::array<Eigen::Matrix<float, -1, -1> >()))->Eigen::DenseBase<Derived>::rowwise<Eigen::ArrayWrapper<const Eigen::Matrix<float, -1, -1> > >() * B.Eigen::ArrayBase<Derived>::cast<NewType>'
testMatOp.cpp:34:3: note: candidates are:
In file included from ../3rdparty/Eigen/Core:336:0,
from ../3rdparty/Eigen/Dense:1,
from testMatOp.cpp:26:
我可能做错了什么。我确实看过这个 post : Cast Eigen::MatrixXd to Eigen::MatrixXf 它正确地描述了如何投射,但我无法让它适用于这个例子。
如有任何帮助,我们将不胜感激。谢谢!
-一个
由于cast()
是一个模板成员函数,在模板代码中你必须在它前面加上template
关键字:
B.template cast<float>();
B
是一个 dependent name。要访问其模板成员 cast
,您必须编写
B.template cast
C++ 是上下文相关的。当遇到 <
时,它会尝试判断它是 operator<
还是尖括号。
// std::vector is a template, so < is an angle bracket
std::vector < float >
// 3 is not a template, so < is operator<
3 < 5
但是B
的类型是const Eigen::ArrayBase<DerivedB>&
,这取决于模板参数DerivedB
。 C++ 无法决定 B.cast
是否为模板。发生这种情况时,C++ 总是猜测它不是模板并将下面的 <
解释为 operator<
.
为什么 C++ 如此 愚蠢 以至于它无法识别先前声明的模板 ArrayBase::cast
?好吧,有人可能会专攻 ArrayBase<int>
.
template<>
class ArrayBase<int>
{
public:
int cast = 3;
};
因此不能推断B.cast
是一个模板。