Как заставить функцию возвращать несколько собственных матриц различных типов (C ++) - PullRequest
0 голосов
/ 19 ноября 2018

Я бы хотел вызвать функцию, которая выделяет, вычисляет, а затем возвращает вызывающей функции несколько собственных матриц.

Размер выходных данных каждой матрицы заранее неизвестен, поэтому мы не можем выделить такие матрицы в вызывающей функции.

Вот то, что я, хотя и был путь (передача матрицы в класс Ref и изменение размера внутри):

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; не компилируется, так как плотные матрицы не могут быть изменены для увеличения памяти

Как правильно это сделать?

1 Ответ

0 голосов
/ 19 ноября 2018

Почему бы не вернуть значение, содержащее оба?

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, вы можете избежать создания значений по умолчанию со структурированными привязками

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
}
...