如何拥有一个函数 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
}
我想调用一个函数来分配、计算,然后 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
}