在ViennaCL中从std :: vector转换为ublas :: compressed_matrix

时间:2013-09-02 01:07:04

标签: c++ boost ublas viennacl

我正在寻找一些计算并将结果雅各比NxN矩阵和右侧矢量(n)传递给boost的ublas并最终传递给ViennaCL。

使用copy()没有问题,但是,矩阵证明是困难的。任何帮助将不胜感激

// Global Variables
vector< vector<float> > Jacobian(0, vector<float>(0)); //Jacobian matrix
vector<float> delta_PQ; //rhs

//
// Set up some ublas objects
//
ublas::vector<ScalarType> rhs;
ublas::vector<ScalarType> result;
ublas::compressed_matrix<ScalarType> ublas_matrix;
using namespace boost::numeric;


typedef float ScalarType;

// Resize RHS from main program
resize_vector(rhs2, j_dimension);
ublas_matrix2.resize(j_dimension, j_dimension);

//copy content to GPU vector (recommended initialization)
copy(delta_PQ.begin(), delta_PQ.end(), rhs.begin()); //works
copy(Jacobian.begin(), Jacobian.end(), ublas_matrix); //won't compile

我尝试了很多变化并查看了文档:

http://ublas.sourceforge.net/refdoc/classboost_1_1numeric_1_1ublas_1_1compressed__matrix.html

另外,ViennaCL的例子对我不起作用:

http://viennacl.sourceforge.net/viennacl-examples-sparse-matrix.html

经过几个小时的谷歌搜索后,我决定在这里发帖,希望别人可以破解它,为下一个人找到它会更容易。

1 个答案:

答案 0 :(得分:1)

要关闭循环,我想让每个人都知道我为解决问题所做的工作。特别感谢Karl Rupp在ViennaCL项目上的表现。

作为替代方案,直接通过operator()填充ublas矩阵,即

ublas_matrix(1,1) = value1;
ublas_matrix(7,8) = value2;

等。根据值的顺序,直接填充ublas_matrix可能比复制更慢或更快。根据经验,矢量&lt;地图&gt;每当条目以“随机”方式写入时速度更快,而如果按连续顺序填充行和列条目,ublas_matrix会更快(并最终提前向矩阵构造函数提供非零条目的数量)。