是否可以获取矩阵行的引用?

时间:2016-11-27 17:36:32

标签: c++ eigen3

我有以下使用Eigen C ++ Library的代码。

void myFunc(Eigen::MatrixXf& myrow)
{

  myrow.setOnes();
}



int main()
{


  Eigen::MatrixXf A(2,3);
  Eigen::MatrixXf tmp1(1,3);
  myFunc(tmp1);
  A.row(1) = tmp1;
  std::cout<<"A is..\n"<<A<<std::endl;
  return 0;

}

如您所见,为了操纵Matrix A的行,我使用了一个临时变量&#34; tmp1&#34;。是否可以在不使用任何临时变量的情况下完成?我不想通过整个矩阵&#34; A&#34;到函数,作为参数。请注意,&#34; myFunc&#34;仅仅是一个例子,我可能不得不在函数内部做一些复杂的事情来操纵&#34; A&#34;的行。还请注意,我,有时候,我想打电话给#34; myFun&#34;如示例中所示。所以我需要一个适用于这两种情况的解决方案。

3 个答案:

答案 0 :(得分:5)

Eigen支持引用给定矩阵中的子矩阵的块表达式。您可以将此块直接传递给您的函数:

void myFunc(Eigen::MatrixXf::RowXpr myrow)
{
    myrow.setOnes();
}

...
myFunc(A.row(1));

块表达式为Block

答案 1 :(得分:2)

您可以在Nico's answer中将功能模板化为以下内容:

template<typename Derived>
void myFunc(Eigen::MatrixBase<Derived>& m)
{
    m.setOnes();
}

int main()
{
    Eigen::MatrixXf A(2, 3);
    Eigen::MatrixXf tmp1(1, 3);
    myFunc(tmp1);
    A.row(1) = tmp1;
    std::cout << "A is..\n" << A << std::endl;

    myFunc(A.row(0));
    std::cout << "A is..\n" << A << std::endl;

    return 0;
}

答案 2 :(得分:0)

即兴回复,我得到了以下代码。实际上我们是在愚弄编译器并删除&#34; const&#34;在里面&#34; myFunc&#34;。我不确定这是一种干净的方法,也不确定这种方法的任何性价格。

template<typename Derived>
void myFunc(Eigen::MatrixBase<Derived> const& m)
{
    Eigen::MatrixBase<Derived>& m_dummy = const_cast<Eigen::MatrixBase<Derived>& > (m);
    m_dummy.setOnes();
}

int main()
{
    Eigen::MatrixXf A(2, 3);
    Eigen::MatrixXf tmp1(1, 3);
    myFunc(tmp1);
    A.row(1) = tmp1;
    std::cout << "A is..\n" << A << std::endl;

    myFunc(A.row(0));
    std::cout << "A is..\n" << A << std::endl;

    return 0;
}