如何传递特征矩阵行参考,将其视为向量?

时间:2015-08-21 15:32:32

标签: c++ eigen

我有一个在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;

但有没有办法直接这样做?

2 个答案:

答案 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也可能导致性能下降。