如何将矩阵的列(或行)传递给函数作为l值向量引用?下面是一个动态分配矩阵的例子:
#include "eigen3/Eigen/Eigen"
void f2(Eigen::VectorXd &v) {
v(0) = 0e0;
}
void f1(Eigen::MatrixXd &m) {
if (m(0,0) == 0e0) {
// both calls below fail to compile
// f2(m.col(0)); // ERROR
// f2(m(Eigen::all, 0)); //ERROR
}
return;
}
int main() {
Eigen::MatrixXd m = Eigen::MatrixXd::Random(3,3);
f1(m);
return 0;
}
在f1
中调用f2
触发编译错误,类型为:
对于编译时大小的矩阵,我也面临同样的问题,例如错误:不能绑定类型的非const左值引用' Eigen::VectorXd& '{也称为' Eigen::Matrix<double,>& '}到右值类型' Eigen::VectorXd '{也称为' Eigen::Matrix<double,> '}
constexpr const int N = 3;
void f2(Eigen::Matrix<double,N,1> &v) {
v(0) = 0e0;
}
void f1(Eigen::Matrix<double,N,N> &m) {
if (m(0,0) == 0e0) {
// all calls below fail to compile
// f2(m.col(0)); ERROR
// f2(m(Eigen::all, 0)); ERROR
// f2(m.block<N,1>(0,0)); ERROR
}
return;
}
int main() {
Eigen::Matrix<double,N,N> m = Eigen::Matrix<double,N,N>::Random();
f1(m);
return 0;
}
这就是Eigen::Ref的设计目的。
void f2(Eigen::Ref<Eigen::VectorXd> v) {
v[0] = 123.;
}
void f1(Eigen::Ref<Eigen::MatrixXd> m) {
m(1, 0) = 245.;
}
int main()
{
Eigen::MatrixXd m(10, 10);
f1(m);
f2(m.col(0));
assert(m(0,0) == 123.);
assert(m(1,0) == 245.);
// also works with parts of a matrix, or segments of a vector
f1(m.bottomRightCorner(4, 4));
}
注意,可变引用只有在内部维度上的元素是连续的情况下才有效。因此,它适用于列主矩阵(默认值)的单个列,而不是行。对于行为主矩阵,则相反。
const refs (const Eigen::Ref<const Eigen::VectorXd>&
)在这些情况下确实有效,但它们创建了一个临时副本。