Ich versuche, eine Eigen :: Matrix als Referenz an eine Klasse zu übergeben und auf die darin enthaltenen Elemente zuzugreifen.C++ Eigen :: Zugriff auf Matrix nach dem Übergang zur Klasse nicht möglich
Wenn ich versuche, wieder die Matrix für den Zugriff auf die Haupt-Funktion und in der Klasse, versagt es und gibt Segmentierung Fehler, wenn die Matrixgröße groß ist. Ich habe einen Debugger verwendet, um die Werte der Matrix zu überprüfen und festgestellt, dass die Elemente der Matrix nicht zugänglich waren.
Unten ist mein Code:
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
}
Sie geben immer noch die richtige Anzahl von Zeilen und Spalten, aber ich kann einfach nicht auf die Elemente im Inneren zugreifen.
Warum funktioniert es nicht und wie kann ich es lösen? Gibt es sonst eine bessere Methode, dies richtig zu machen?
Auch merke ich, dass die Zeit testLoadMat()
steigt mit der Matrixgröße auszuführen. Bedeutet das, dass ich das "passing by reference" falsch mache?
Welche speziell nennen macht es scheitern? –