【问题标题】:How to access/write a matrix in a function using Eigen?如何使用 Eigen 在函数中访问/写入矩阵?
【发布时间】:2014-12-03 10:48:24
【问题描述】:

我正在尝试使用 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 >' 和'int') res(i,i)=(sing_val_vector[i]

'operator[]' 不匹配(操作数类型为'Eigen::EigenBase >' 和'int') res(i,i)=(sing_val_vector[i]

调用“(Eigen::EigenBase >) (int&, int&)”不匹配 res(i,i)=(sing_val_vector[i]

当我这样调用函数时:

invertSingularValues(S.data,S_inv);

S.data 和 S_inv 是特征矩阵。 我能做什么?

【问题讨论】:

    标签: c++ function matrix eigen


    【解决方案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);
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多