我想调用一个分配,计算然后将几个本征矩阵返回给调用函数的函数。
每个矩阵的输出大小事先未知,因此我们无法在调用函数中分配此类矩阵。
这就是我的方法(通过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;
无法编译,因为无法调整密集矩阵的大小以增加内存
解决这个问题的正确方法是什么?
答案 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
}