2017-07-06 47 views
0

我正在使用pthreads和特徵庫編寫並行程序。 我的計劃看起來是這樣的:使用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, ...); 
    ... 
} 

基本上,我需要的向量和矩陣爲全局變量,能夠訪問它們的功能。 程序編譯,但是當我執行它,我收到以下錯誤:

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

起初我還以爲我是想訪問向量的非法一部分,但後來我改變了「power_method」功能:

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

我仍然得到相同的錯誤。 我的猜測是,我定義矢量和矩陣的方式是不正確的,但我找不到任何說什麼是正確的方法。

回答

0

你有兩個v1變量:

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 
} 

你的主要需求初始化的全局變量。我推測像

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