2016-05-19 10 views
1

Ich habe ein kleines Problem, aber ich weiß nicht, wie man es löst.Wie Eigen: Matrix durch Referenz

Los geht's: Ich muss an einer großen Eigenmatrix mit Multithreads arbeiten. Jeder Thread muss auf die Matrix zugreifen. Die Dimension wird während der Programmausführung angegeben, daher muss ich sie innerhalb von main() und nicht als global deklarieren. Ich habe verschiedene Lösungen ohne Erfolg ausprobiert. Ich suche etwas wie "pass by reference", aber ich habe gelesen, dass diese Methode nicht mit Eigen Matrix funktioniert. Hier ist ein kleines Beispiel. Kann mir jemand sagen, wie ich dieses Problem lösen kann? Das Programm muss schnell sein, also so etwas wie: -Speichern Sie die Matrix in einer Datei, und lesen Sie die Datei in jedem Thread, arbeiten Sie an der Matrix, speichern Sie die Matrix in einer Datei, lesen Sie die Datei von der Haupt- wieder nicht der beste Weg, denke ich ...;) Weiß jemand eine bessere Lösung? Danke an alle!

void calc() { 
    // work on the Matrix 
} 

int main() { 
    Eigen::Matrix<bool, a, b> Mat; 
    // Start some thread(calc); 
    cout << Mat; 
} 
+1

passieren nur 'Mat' zu' durch Bezugnahme calc', das heißt mit der Art 'Matrix & '. Sie können es auch global deklarieren und 'Mat.resize (rows, cols);' aufrufen, aber das ist hässlich. – ggael

Antwort

0

Si! Eigen Matrix kann als Referenz übergeben werden.

Hier ist ein funktionierendes Beispiel:

#include <iostream> 
#include <Eigen/Dense> 

void calc(Eigen::MatrixXf& mat) { 
    mat = Eigen::MatrixXf::Constant(mat.rows(), mat.cols(), 1.0); 
} 

int main() { 
    Eigen::MatrixXf Mat; 
    Mat = Eigen::Matrix4f::Identity(); 
    std::cout << Mat << std::endl; 
    calc(Mat); 
    std::cout << Mat << std::endl; 
} 
  • Ausgang:

    1 0 0 0  
    0 1 0 0  
    0 0 1 0  
    0 0 0 1 
    
    1 1 1 1 
    1 1 1 1 
    1 1 1 1 
    1 1 1 1 
    
+0

Danke !!! Es funktioniert mit einer kleinen Änderung: das ist der Arbeitscode mit Thread (kompiliert mit -lpthread); Das Problem war, dass ich nicht std :: ref (Mat) in Thread-Initialisierung verwenden! #include #include #include Hohlraum calc (Eigen :: MatrixXf & mat) { mat = Eigen :: :: MatrixXf Constant (mat.rows(), mat.cols(), 1.0) ; } int main() { Eigen :: MatrixXf Matte; Mat = Eigen :: Matrix4f :: Identität(); std :: cout << Mat << std :: endl; Std :: Faden a (calc, std :: ref (Mat)); // berechnet (Mat); std :: cout << Mat << std :: endl; } – MttD