我正在寻找一些计算方法,并将所得的Jacobian 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
经过数小时的谷歌搜索,我决定在此处发布信息,希望其他人可以破解它,并且对于下一个人来说更容易找到。
最佳答案
为了解决这个问题,我想让所有人都知道我为解决问题所做的工作。特别感谢Karl Rupp在ViennaCL项目上所做的工作。
或者,直接通过operator()填充ublas-matrix,即
ublas_matrix(1,1) = value1;
ublas_matrix(7,8) = value2;
等等。根据值的顺序,直接填充ublas_matrix可能比复制慢或快。根据经验,每当以“随机”方式写入条目时,vector 都会更快,而如果您以连续顺序填充行和列条目(并最终向矩阵提供非零条目的数量),则ublas_matrix会更快构造函数)。