我正在尝试使用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是特征矩阵。 我该怎么办?
答案 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);
};