c++ - 将 MatrixXd 的行传递给要修改的函数,而不在 Eigen 中创建副本
问题描述
这个问题与 C++ 和 Eigen 有关。
我有一个函数可以计算一些向量Eigen::VectorXd
并将它们存储到作为参数传递的向量中。函数的返回值是函数中完成的迭代次数。下面是函数的伪代码:
size_t integrate(Eigen::VectorXd& v) {
size_t numIterations = 0;
// do some iterative calculations and increment numIterations
// vNew is generated from the new calculations
v = vNew;
return numIterations;
}
我想使用这个功能的方式如下:
Eigen::MatrixXd q = Eigen::MatrixXd::Zero(numRows, numCols);
for(size_t i = 0; i < numSteps; i++) {
integrate(q.row(i));
}
但是,这不会在 Visual Studio 中编译。我收到C++ initial value of reference to non-const must be an lvalue
编译器错误。我的目的是避免不必要的复制,并在 for 循环的每次迭代中将计算结果(向量)放入矩阵中。我知道这row()
不会返回一个VectorXd
. 我已经尝试了一些其他的东西,但都没有奏效。MatrixXd
填充Eigen中预先分配的行的有效方法是什么?
注意:我知道我可以通过 ref 将矩阵连同当前值i
和 do q.row(i) = vNew;
in一起传递给函数integrate()
。然而,它看起来很丑陋,对我来说是不必要的。integrate()
真的不需要知道任何关于 a 的事情MatrixXd
。
谢谢你。
解决方案
您可以使用Eigen::Ref
对象将可写引用传递给矩阵块。在您的情况下,由于(主要列)矩阵的行将具有内部跨度,因此您需要明确允许:
size_t integrate(Eigen::Ref<Eigen::VectorXd, 0, Eigen::InnerStride<> > v) {
v.setRandom(); // use `v` as if it was a VectorXd
return 0;
}
为了获得更好的性能,您应该考虑q
以行主要形式存储,或者将各个列传递给integrate
:
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> q; q.setZero(numRows, numCols);
// ...
integrate(q.row(i));
或者:
Eigen::MatrixXd q; q.setZero(numRows, numCols); // you'll need to switch how many rows and cols are to be allocated
// ...
integrate(q.col(i));
在任何一种情况下,integrate
都可以采用简单的Eigen::Ref<Eigen::VectorXd>
(又名Eigen::Ref<Eigen::VectorXd, 0, Eigen::InnerStride<1> >
):
size_t integrate(Eigen::Ref<Eigen::VectorXd> v) {
// ...
推荐阅读
- python-3.x - 错误:PyOpt 中 (1) 处的实际参数与 (2) 处的实际参数(标量和等级 1)之间的等级不匹配
- c - 文件 I/O 在不同的操作系统上产生不同的结果。为什么?
- flutter - 为什么 FCM 在 Flutter 中无法在 ios 上工作
- javascript - 如何使用特定用户凭据在 Firebase 中创建记录?
- python - Opencv,当不再检测到人脸时重置附加列表
- c - 使用 MPI 时,如何修复错误:“_int_malloc: Assertion `(unsigned long) (size) >= (unsigned long) (nb)' failed”?
- command-line - 如何在启动时运行批处理文件,但前提是计算机名称已更改?
- c# - 在 devexpress 中为某些单元格着色
- .net-core - 如何从运行一组 Nunit 测试用例的 .net 核心应用程序中读取连接字符串
- python - seaborn-boxplot 中位数和分位数绘图轴未与 Power Bi 中的数据值对齐?