如何让函数返回几个不同类型的本征矩阵(C ++)

时间:2018-11-19 17:32:58

标签: c++ eigen

我想调用一个分配,计算然后将几个本征矩阵返回给调用函数的函数。

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

这就是我的方法(通过Ref类传递矩阵,并在内部调整大小):

prev

但是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;无法编译,因为无法调整密集矩阵的大小以增加内存

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

1 个答案:

答案 0 :(得分:0)

为什么不返回同时包含两者的值?

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
}