如何拥有一个函数 return 几个不同类型的特征矩阵 (C++)

How to have a function return several different type Eigen matrixes (C++)

我想调用一个函数来分配、计算,然后 returns 到调用函数几个特征矩阵。

事先不知道每个矩阵的输出大小,因此我们不能在调用函数中分配此类矩阵。

这是我认为的方式(通过 Ref class 传递矩阵,并在内部调整大小):

FromImageToAb(image, 
Eigen::Ref<Eigen::SparseMatrix<double>> Aout, Eigen::Ref<Eigen::VectorXd> bout){

    ... // determine what size matrixes must have: int equationcounter, numberofunknowns

    // Allocate matrixes of the correct size
    SparseMatrix<double> A(equationcounter, numberofunknowns);
    SparseMatrix<double> bM(equationcounter, 1);

    ... // fill A and bM 

    VectorXd b(bM); // Now we have successfully created a dense vector of the correct size that cannot be known before hand

    Aout = A;
    bout = b;
}


main(){
    SparseMatrix<double> Aout(1,1); // Creating matrix with token size
    VectorXd bout(1); // Creating matrix with token size
    FromImageToAb(image, Aout, bout);

}

但是Aout = A;不分配内存和复制值所以它可以在外面使用 bout = b; 无法编译,因为无法调整密集矩阵的大小来增加内存

解决这个问题的正确方法是什么?

为什么不 return 包含两者的值?

std::tuple<Eigen::SparseMatrix<double>, Eigen::VectorXd> FromImageToAb(image_t image)
{
    ... // determine what size matrixes must have: int equationcounter, numberofunknowns

    // Allocate matrixes of the correct size
    SparseMatrix<double> A(equationcounter, numberofunknowns);
    SparseMatrix<double> bM(equationcounter, 1);

    ... // fill A and bM 

    return { a, bM }; // Uses implicit conversion of SparseMatrix<double> -> VectorXd
}

如果您有 C++17 编译器,则可以避免使用 structured bindings

默认构造值
int main(){
    auto [a, b] = FromImageToAb(image);
    // use a and b
}

否则你可以用std::tie

分配多个东西
int main(){
    SparseMatrix<double> a; // Default construct
    VectorXd b; // Default construct
    std::tie(a, b) = FromImageToAb(image);
    // use a and b
}