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

标签 c++ boost ublas viennacl

我想做一些计算并将生成的 Jacobian NxN 矩阵和右侧 vector (n) 传递给 boost 的 ublas 并最终传递给 ViennaCL。

vector 使用 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

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

最佳答案

为了结束这个循环,我想让每个人都知道我做了什么来解决我的问题。特别感谢 ViennaCL 项目的 Karl Rupp。

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

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

等根据值的顺序,直接填充 ublas_matrix 可能比复制更慢或更快。根据经验,只要条目以“随机”方式写入, vector< map > 就会更快,而如果您按连续顺序填充行和列条目(并最终向矩阵提供非零条目的数量),则 ublas_matrix 会更快构造函数)。

关于c++ - 在 ViennaCL 中从 std::vector 转换为 ublas::compressed_matrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18564460/

相关文章:

c++ - 如何用 cvmGet 替换对 cvGetReal2D 的调用?

c++ - GCC 错误:无法将 offsetof 应用于成员函数 MyClass::MyFunction

c++ - 如何开始编写智能指针?

c++ - 如何使用 Visual Studio 2013 CTP 构建 Boost 1.55 2013 年 11 月

c++ - 何时在 Boost Test 库中使用手动注册?

c++ - 从另一个子 vector 或子矩阵创建 boost::numeric::ublas vector

c++ - 我应该在传统回调上使用 Qt 信号/槽机制吗?

c++ - boost 共享内存。当前有多少进程正在使用共享内存?

c++ - 如何让迭代器指向 boost::numeric::ublas::matrix<T> 的一行?

c++ - 按值返回 boost ublas 矩阵仅在 vs2012 的发布配置中工作