Eigen 中三元运算符输入错误

问题描述 投票:0回答:2

我正在用 C++ 编写一个类来概括两个稀疏矩阵求解器(SparseLU 和 Sparse Cholesky)。当我尝试使用三元运算符时,它说操作数类型不兼容,但如果我使用 If 语句,代码就会编译。

Error 2 错误:操作数类型不兼容(“const Eigen::Solve < Eigen::SimplicialLDLT < Eigen::SparseMatrix < double, 0, int > , 1, Eigen::AMDOrdering < int > > , Eigen::Matrix < double, -1, 1, 0, -1, 1 > > ”和“const Eigen::Solve < Eigen::SparseLU < Eigen::SparseMatrix < double, 0, int > , Eigen::COLAMDOrdering < int > > ,特征::矩阵 < double, -1, 1, 0, -1, 1 > > ")

eigen::VectorXd solve(eigen::VectorXd &b) {
    return is_cholesky ? cholesky.solve(b) : lu.solve(b); // ERROR
}

X

eigen::VectorXd solve(eigen::VectorXd &b) {
    if (is_cholesky) {
        return cholesky.solve(b);
    }
    else {
        return lu.solve(b);
    }
}

完整代码:

#pragma once  

#ifndef SOLVER_H
#define SOLVER_H

#include <Eigen/Core>
#include <Eigen/Sparse>
#include <Eigen/SparseLU>
#include <Eigen/SparseCholesky>

#define eigen Eigen

class Solver {
private:
    bool is_cholesky;
    eigen::SimplicialLDLT<eigen::SparseMatrix<double>> cholesky;
    eigen::SparseLU<eigen::SparseMatrix<double>> lu;

public:
    Solver(bool is_choleski) {
        this->is_cholesky = is_choleski;
    }

    eigen::ComputationInfo info() {
        return is_cholesky ? cholesky.info() : lu.info();
    }

    void compute(eigen::SparseMatrix<double> &B) {
        is_cholesky ? cholesky.compute(B) : lu.compute(B);
    }

    eigen::VectorXd solve(eigen::VectorXd &b) {
        return is_cholesky ? cholesky.solve(b) : lu.solve(b); // ERROR HERE
    }
};

#endif // SOLVER_H
c++ eigen
2个回答
5
投票

a ? b : c
表达式类型的规则要求它是
b
表达式的类型或
c
表达式的类型。

这里

cholesky.solve(b)
的类型与
lu.solve(b)
不同,并且两者都没有隐式转换。生成的表达式需要转换为
eigen::VectorXd
被忽略。因此出现“操作数类型不兼容”错误。

return is_cholesky ? cholesky.solve(b) : lu.solve(b); // ERROR

这里每个表达式都必须直接转换为

eigen::VectorXd
,这是存在的。

if (is_cholesky) {
    return cholesky.solve(b);
}
else {
    return lu.solve(b);
}

您可以通过明确提及来将

?:
表达式的类型强制为
eigen::VectorXd
,例如

return is_cholesky ? eigen::VectorXd{ cholesky.solve(b) } : lu.solve(b);

0
投票

https://tmp.mosra.cz/eigen-docs/TopicPitfalls.html#TopicPitfalls_ternary_operator

关于 http://eigen.tuxfamily.org/ 的官方文档现已不可用,另请参阅 eigen/doc/Pitfalls.dox

解决方案:

return is_cholesky ? cholesky.solve(b).eval() : lu.solve(b);

© www.soinside.com 2019 - 2024. All rights reserved.