2017-12-21 5 views
0

Eigen :: Matrix를 참조로 클래스에 전달하고 그 요소에 액세스하려고합니다.C++ Eigen :: 클래스에 전달한 후 Matrix에 액세스 할 수 없습니다

주 함수와 클래스 모두에서 다시 행렬에 액세스하려고하면 행렬 크기가 클 경우 실패하고 세그먼트 화 오류가 발생합니다. 디버거를 사용하여 행렬 값을 확인한 결과 행렬의 요소에 액세스 할 수 없음을 알았습니다. 다음은

내 코드입니다 :

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()을 실행하는 시간이 행렬 크기와 함께 증가한다는 것을 알았습니다. 내가 "참조에 의한 전달"을 잘못하고 있음을 의미합니까?

+0

당신의 testLoadMat 함수의 매개 변수 유형을 변경하는 것입니다? –

답변

0

mainA 유형은 Eigen::MatrixXf 또는 Matrix<float, Eigen::Dynamic, Eigen::Dynamic>입니다. testLoadMat 함수는 Eigen::Matrix<float,3,Eigen::Dynamic> 개체에 대한 참조를 원합니다. 이러한 유형이 서로 다르므로 올바른 유형의 임시 매트릭스가 만들어지고이 임시 객체에 대한 참조는 testLoadMat으로 전달됩니다. testLoadMat은이 임시 행렬에 대한 포인터를 저장합니다.이 포인터는 함수가 반환되고 임시 행렬이 삭제 될 때 무효가됩니다. testReadMat에 전화하면이 잘못된 포인터를 역 참조하므로 정의되지 않은 동작이 발생합니다.

수정은 전달하고있는 유형과 일치 할 수 있습니다. 구체적으로는 실패하게 전화

+0

모든 변수 유형을'Eigen :: MatrixXf'로 바꾸면됩니다. 더 많은 질문이 두 개 더 있습니다. 1) 행렬 크기가 작을 때 코드가 제대로 작동하는 이유는 무엇입니까? 여전히 행렬의 열에 액세스 할 수 있습니다. 2) 행 번호를 미리 알고 있거나 모든 경우에'Eigen :: MatrixXf'를 사용하는 것이 좋을 경우'Eigen :: Matrix '을 사용하면 어떤 이점이 있습니까? – mjfoo21

+0

@ mjfoo21 1) 운이 좋다. 이전에 행렬에 사용 된 메모리는 재사용되지 않았으므로 (여전히 데이터가 있음) 여전히 작동중인 것처럼 보입니다. 2) 성능. 템플릿 유형에 포함하는 구체적인 데이터가 많을수록 메모리 할당을 줄일 수 있습니다. 더 자세한 것은'Matrix' 템플릿에있는 Eigen 문서를보십시오. – 1201ProgramAlarm

관련 문제