我有一个在Vector引用上运行的函数,例如
void auto_bias(const Eigen::VectorXf& v, Eigen:Ref<Eigen::VectorXf>> out)
{
out = ...
}
并且在某些时候我需要让这个功能在Matrix行上运行。现在,因为默认的内存布局是列专业,我不能只是Map&lt;&gt;行指向的数据到向量中。那么,我该如何将行传递给上面的函数以便我可以对它进行操作呢?
不那么漂亮的解决方案是使用临时矢量,例如
VectorXf tmpVec = matrix.row(5);
auto_bias(otherVector, tmpVec);
matrix.row(5) = tmpVec;
但有没有办法直接这样做?
答案 0 :(得分:2)
您可以修改函数以引用行类型(向量表达式)而不是向量。这实际上只能通过模板来管理,以便为您推断出这种类型:
#include <iostream>
#include <Eigen/Core>
template<typename V>
void set_row(V&& v) {
v = Eigen::Vector3f(4.0f, 5.0f, 6.0f);
}
int main() {
Eigen::Matrix3f m = Eigen::Matrix3f::Identity();
set_row(m.row(1));
std::cout << m;
return 0;
}
答案 1 :(得分:2)
您可以允许Ref<>
具有非默认的内部步幅(也称为增量),如下所示:
Ref<VectorXf, 0, InnerStride<>>
参见参考文献documentation的示例函数foo3
。
缺点是即使传递真实的VectorXf
也可能导致性能下降。