C ++ Eigen ::传递给Class后无法访问矩阵

时间:2017-12-21 05:06:12

标签: c++ matrix pass-by-reference eigen

我试图通过引用将Eigen :: Matrix传递给类并访问其中的元素。

当我尝试在main函数和类中再次访问矩阵时,如果矩阵大小很大,它将失败并产生分段错误。我使用调试器来检查矩阵的值,发现矩阵的元素不可访问。

以下是我的代码:

的main.cpp

function [] = BinarySearch(A,beg,last,item)
mid=floor((last+beg)/2);
if (beg)<=last
    if item==A(mid)
        fprintf('Item found at position %d \n',mid);
    else    
        if(item<A(mid))
            BinarySearch(A,beg,mid,item)
        else
            BinarySearch(A,mid,last,item)
        end    
    end
else
     fprintf('Item not found\n');
end

model.h

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

class model
{
    public:
        const Eigen::Matrix<float,3,Eigen::Dynamic> *testMat;
        void testLoadMat(const Eigen::Matrix<float,3,Eigen::Dynamic> &tMat);
        void testReadMat();
}

他们仍然提供正确数量的行和列,但我无法访问其中的元素。

为什么它不起作用,我该如何解决?否则,有没有更好的方法来正确地做到这一点?

另外,我注意到执行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 } 的时间随矩阵大小的增加而增加。这是否意味着我正在“错误地通过引用”?

1 个答案:

答案 0 :(得分:0)

Amain的类型为Eigen::MatrixXfMatrix<float, Eigen::Dynamic, Eigen::Dynamic>。您的testLoadMat函数需要引用Eigen::Matrix<float,3,Eigen::Dynamic>对象。由于这些是不同的类型,因此会创建一个正确类型的临时Matrix,它是对传递给testLoadMat的临时对象的引用。 testLoadMat然后存储指向此临时Matrix的指针,该函数在函数返回并且销毁临时Matrix时变为无效。当您调用testReadMat时,您取消引用此无效指针,从而导致未定义的行为。

修复方法是更改​​testLoadMat函数的参数类型以匹配您传入的类型。