使用c ++中的特征库定义全局向量

时间:2017-07-06 14:13:23

标签: c++ pthreads eigen

我正在使用pthreads和特征库编写并行程序。 我的程序看起来像这样:

#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, ...);
    ...
}

我基本上需要向量和矩阵作为全局变量才能在函数中访问它们。 程序编译但是当我执行它时,我收到以下错误:

  

断言失败:(startRow&gt; = 0&amp;&amp; blockRows&gt; = 0&amp;&amp; startRow&lt; = xpr.rows() - blockRows&amp;&amp; startCol&gt; = 0&amp;&amp; blockCols &gt; = 0&amp;&amp; startCol&lt; = xpr.cols() - blockCols),功能块,文件......

起初我以为我试图访问向量的非法部分,但后来我更改了“power_method”函数:

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

我仍然得到同样的错误。 我的猜测是我定义向量和矩阵的方式不正确,但我找不到任何说明正确方法的东西。

1 个答案:

答案 0 :(得分: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
}