C++ Eigen::传递给 Class 后无法访问矩阵
C++ Eigen:: Unable to Access Matrix after Passing to Class
我正在尝试通过引用将 Eigen::Matrix 传递给 class 并访问其中的元素。
当我尝试在 main 函数和 class 中再次访问矩阵时,如果矩阵大小很大,它会失败并给出分段错误。我用调试器检查了矩阵的值,发现无法访问矩阵的元素。
下面是我的代码:
main.cpp
Eigen::MatrixXf A = Eigen::MatrixXf::Random(3,640); //this is OK
//Eigen::MatrixXf A = Eigen::MatrixXf::Random(3,640*480); //but not this
std::cout << "in main A col " << A.cols() << " row " << A.rows()
<< "\nA\n" << A.col(100) << "\n\n";
model.testLoadMat(A);
model.testReadMat();
std::cout << "in main testMat col " << model.testMat->cols() << " row " << model.testMat->rows()
<< "\ntestMat\n" << model.testMat->col(100) << "\n\n"; //fails here if A is large
return 0;
model.h
class model
{
public:
const Eigen::Matrix<float,3,Eigen::Dynamic> *testMat;
void testLoadMat(const Eigen::Matrix<float,3,Eigen::Dynamic> &tMat);
void testReadMat();
}
model.cpp
void model::testLoadMat(const Eigen::Matrix<float,3,Eigen::Dynamic> &tMat)
{
testMat = &tMat;
std::cout << "in testLoadMat col " << testMat->cols() << " row " << testMat->rows()
<< "\ntestMat\n" << testMat->col(100) << "\n\n";
}
void model::testReadMat()
{
std::cout << "in testReadMat col " << testMat->cols() << " row " << testMat->rows()
<< "\ntestMat\n" << testMat->col(100) << "\n\n"; //fails here if A is large
}
他们仍然提供正确的行数和列数,但我无法访问其中的元素。
为什么它不起作用,我该如何解决?否则,有没有更好的方法来正确地做到这一点?
此外,我注意到执行 testLoadMat()
的时间随着矩阵大小的增加而增加。这是否意味着我做的 "passing by reference" 不正确?
main
中 A
的类型是 Eigen::MatrixXf
或 Matrix<float, Eigen::Dynamic, Eigen::Dynamic>
。您的 testLoadMat
函数需要对 Eigen::Matrix<float,3,Eigen::Dynamic>
对象的引用。由于这些是不同的类型,因此创建了一个正确类型的临时 Matrix,它是传递给 testLoadMat
的这个临时对象的引用。 testLoadMat
然后存储一个指向这个临时Matrix的指针,当函数returns和临时Matrix被销毁时,它就失效了。当您调用 testReadMat
时,您取消了对这个无效指针的引用,导致未定义的行为。
解决方法是更改 testLoadMat
函数的参数类型以匹配您传入的类型。
我正在尝试通过引用将 Eigen::Matrix 传递给 class 并访问其中的元素。
当我尝试在 main 函数和 class 中再次访问矩阵时,如果矩阵大小很大,它会失败并给出分段错误。我用调试器检查了矩阵的值,发现无法访问矩阵的元素。
下面是我的代码:
main.cpp
Eigen::MatrixXf A = Eigen::MatrixXf::Random(3,640); //this is OK
//Eigen::MatrixXf A = Eigen::MatrixXf::Random(3,640*480); //but not this
std::cout << "in main A col " << A.cols() << " row " << A.rows()
<< "\nA\n" << A.col(100) << "\n\n";
model.testLoadMat(A);
model.testReadMat();
std::cout << "in main testMat col " << model.testMat->cols() << " row " << model.testMat->rows()
<< "\ntestMat\n" << model.testMat->col(100) << "\n\n"; //fails here if A is large
return 0;
model.h
class model
{
public:
const Eigen::Matrix<float,3,Eigen::Dynamic> *testMat;
void testLoadMat(const Eigen::Matrix<float,3,Eigen::Dynamic> &tMat);
void testReadMat();
}
model.cpp
void model::testLoadMat(const Eigen::Matrix<float,3,Eigen::Dynamic> &tMat)
{
testMat = &tMat;
std::cout << "in testLoadMat col " << testMat->cols() << " row " << testMat->rows()
<< "\ntestMat\n" << testMat->col(100) << "\n\n";
}
void model::testReadMat()
{
std::cout << "in testReadMat col " << testMat->cols() << " row " << testMat->rows()
<< "\ntestMat\n" << testMat->col(100) << "\n\n"; //fails here if A is large
}
他们仍然提供正确的行数和列数,但我无法访问其中的元素。
为什么它不起作用,我该如何解决?否则,有没有更好的方法来正确地做到这一点?
此外,我注意到执行 testLoadMat()
的时间随着矩阵大小的增加而增加。这是否意味着我做的 "passing by reference" 不正确?
main
中 A
的类型是 Eigen::MatrixXf
或 Matrix<float, Eigen::Dynamic, Eigen::Dynamic>
。您的 testLoadMat
函数需要对 Eigen::Matrix<float,3,Eigen::Dynamic>
对象的引用。由于这些是不同的类型,因此创建了一个正确类型的临时 Matrix,它是传递给 testLoadMat
的这个临时对象的引用。 testLoadMat
然后存储一个指向这个临时Matrix的指针,当函数returns和临时Matrix被销毁时,它就失效了。当您调用 testReadMat
时,您取消了对这个无效指针的引用,导致未定义的行为。
解决方法是更改 testLoadMat
函数的参数类型以匹配您传入的类型。