如何使用Eigen在函数中访问/写入矩阵?

时间:2014-10-08 17:12:14

标签: c++ function matrix eigen

我正在尝试使用Eigen编写一个函数,该函数将对角矩阵与通常的稍微不同。当对角线的元素为零(或相对接近零)时,它应该将对角元素的值设置为零,否则该值应为1 /(对应的元素)。我试着编写一个接收我想要反转的对角矩阵的函数(它实际上是一个nx1矩阵,因此得名)和另一个指针,我希望将结果放入:

template <typename m1, typename m2>
void invertSingularValues(Eigen::EigenBase<m1>& sing_val_vector,Eigen::EigenBase<m2>& res)
{
    for (int i=0; i<sing_val_vector.rows();i++)
        res(i,i)=(sing_val_vector[i]<0.0000001?0:1/sing_val_vector[i]);
};

似乎我无法通过使用(i,j)或[i]来访问矩阵的元素,因为我得到了这个错误:

  

'operator []'不匹配(操作数类型是'Eigen :: EigenBase&gt;'和'int')       RES(I,I)=(sing_val_vector [1] - ; 0.0000001?0:1 / sing_val_vector [I]);

     

'operator []'不匹配(操作数类型是'Eigen :: EigenBase&gt;'和'int')       RES(I,I)=(sing_val_vector [1] - ; 0.0000001?0:1 / sing_val_vector [I]);

     

无法匹配'(Eigen :: EigenBase&gt;)(int&amp;,int&amp;)'       RES(I,I)=(sing_val_vector [1] - ; 0.0000001?0:1 / sing_val_vector [I]);

当我这样调用函数时:

invertSingularValues(S.data,S_inv);

S.data和S_inv是特征矩阵。  我该怎么办?

1 个答案:

答案 0 :(得分:1)

正如编译器所说,当res属于EigenBase类型时,你不能做res(i,i)因为EigenBase没有定义这个功能。您需要使用更具体的类,如MatrixBase或DenseBase。

相关文件:

忽略任何代码优化,这样的事情会起作用:

template <typename m1, typename m2>
void invertSingularValues(Eigen::MatrixBase<m1>& sing_val_vector,Eigen::MatrixBase<m2>&    res)
{ 
     for (int i(0); i < sing_val_vector.rows(); i++) 
         for (int j(0); j < sing_val_vector.cols(); j++) 
             res(i,j) = sing_val_vector(i,j) < 1e-07 ? 0.0 : 1.0/sing_val_vector(i,j);
};