Bonjour,
Je me suis mis à boost::numeric::ublas pour mes calculs matriciels et j'ai quelques petits soucis.
J'utilise des vector et matrix de boost::numeric::ublas pour mes calculs. Plus précisemment leurs versions sparses (coordinate_matrix, coordinate_vector).
J'ai deux vecteurs de doubles de tailles n~1000 et p~1000 (très sparses) et je voudrais obtenir leur outer product à plat (dans un vecteur de taille n*p).
J'ai donc pensé à utiliser faire ceci :
Code :
- template<class T_M, class T_V>
- void matrixToVector(const T_M& m, T_V& v){
- assert(m.size1() * m.size2() == v.size() );
- typename T_M::const_iterator1 first1 = m.begin1(), last1 = m.end1(), first2, last2;
- for(typename T_M::const_iterator1 iM1 = first1; iM1 != last1; iM1++){
- first2 = iM1.begin();
- last2 = iM1.end();
- for(typename T_M::const_iterator2 iM2 = first2; iM2 != last2; iM2++){
- v(iM2.index1()*m.size2() + iM2.index2()) = (*iM2);
- }
- }
- }
|
afin de faire
Code :
- boost::numeric::ublas::coordinate_vector a(n), b(p), r(n*p);
- boost::numeric::ublas::coordinate_matrix<double> tmp = outer_prod(a,b);
- matrix2vector(tmp, r);
|
J'obtiens ainsi dans "r" la version à plat de l'outer product.
Mon seul problème est que cette solution n'est ni élégante ni efficace (c'est surtout le second qui m'importe). En effet, l'appel à iM1.begin() fait un find2() qui est une recherche dichotomique (lower_bound). Cela me pose énormément de problèmes d'efficacité. Y-aurait-il une autre manière de réaliser cela (outer product à plat) de manière plus efficace ?