在Eigen中的三元运算符中输入错误

时间:2017-04-27 15:26:33

标签: c++ eigen

我正在用c ++编写一个类来推广两个稀疏​​矩阵求解器(SparseLU和Sparse Cholesky)。当我尝试使用三元运算符时,它表示操作数类型是不兼容的,但如果我使用If语句,代码将编译。

  

错误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&gt ;,Eigen :: COLAMDOrdering< int>>,Eigen :: Matrix< 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

1 个答案:

答案 0 :(得分:4)

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);

    Theme theme = new Theme(loader);
    theme.setLocale("en_US);