2017-07-06 6 views
0

Ich schreibe ein paralleles Programm mit Pthreads und Eigenbibliothek. Mein Programm sieht wie folgt aus:Definieren globalen Vektor mit Eigenbibliothek in C++

#include <Eigen/...> 
#include <pthread.h> 
... 

typedef Eigen::SparseMatrix<long double> matrizLD; 
matrizLD mat; 
typedef Eigen::Matrix<long double, Dynamic, 1> VectorLD; 
VectorLD v1; 
VectorLD v2; 

void *power_method(int rank){ 
    ... 
    int from = from_array[rank] 
    int length = length_array[rank] 
    v1.segment(from,length) = mat.block(from,0,length,size)*v2; //something like this 
} 

int main(...){ 
    size = ...; //an input parameter 
    matrizLD mat(size,size) = ...; 
    VectorLD v1(size) = ...; 
    VectorLD v2(size) = ...; 
    ... 
    pthread_create(..., power_method, ...); 
    ... 
} 

Ich brauche im Grunde die Vektoren und die Matrix globale Variablen in der Lage sein, um sie in der Funktion zuzugreifen. Das Programm kompiliert, aber wenn ich es ausführen bekomme ich folgende Fehlermeldung:

Assertion failed: (startRow >= 0 && blockRows >= 0 && startRow <= xpr.rows() - blockRows && startCol >= 0 && blockCols >= 0 && startCol <= xpr.cols() - blockCols), function Block, file ...

Zuerst dachte ich, ich einen illegalen Teil des Vektors zuzugreifen versuche, aber ich änderte dann den „power_method“ -Funktion für:

void *power_method(int rank){ 
    v1(0); // I can do this from main with no problem 
} 

und ich bekomme immer noch den gleichen Fehler. Meine Vermutung ist, dass die Art, wie ich den Vektor und die Matrix definiere, falsch ist, aber ich konnte nichts finden, was sagt, was der richtige Weg ist.

Antwort

0

Sie haben zwei v1 Variablen:

VectorLD v1; //global 

void *power_method(int rank){ 
    v1.segment(from,length) = mat.block(from,0,length,size)*v2; //something like this 
} 

int main(...){ 
    size = ...; //an input parameter 
    VectorLD v1(size) = ...; //oops another one 
} 

Ihre wichtigsten Bedürfnisse der globalen Variablen initialisieren. Ich vermute etwas wie

int main(...){ 
    size = ...; //an input parameter 
    v1 = VectorLD(size);// global one 
}