Преобразование из std::vector в ublas::ressed_matrix в ViennaCL
Я собираюсь выполнить некоторые вычисления и передать полученную матрицу Якобиана NxN и правый вектор (n) для усиления убласа и, в конечном итоге, 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
После нескольких часов поиска в Google я решил опубликовать здесь в надежде, что кто-то еще может взломать его, и будет легче найти для следующего человека.
1 ответ
Чтобы замкнуть цикл, я хотел, чтобы все знали, что я сделал, чтобы решить мою проблему. Отдельное спасибо Карлу Руппу за проект ViennaCL.
В качестве альтернативы, заполните ублас-матрицу напрямую через operator(), т.е.
ublas_matrix(1,1) = value1;
ublas_matrix(7,8) = value2;
и т.д. В зависимости от порядка значений, прямое заполнение ublas_matrix может выполняться медленнее или быстрее, чем копирование. Как правило, vector