我有以下使用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;如示例中所示。所以我需要一个适用于这两种情况的解决方案。
答案 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;
}