[boost::numeric::ublas] outer_prod et matrix2vector

outer_prod et matrix2vector [boost::numeric::ublas] - C++ - Programmation

Marsh Posté le 12-01-2011 à 18:00:08    

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 :
  1. template<class T_M, class T_V>
  2.   void matrixToVector(const T_M& m, T_V& v){
  3.     assert(m.size1() * m.size2() == v.size() );
  4.     typename T_M::const_iterator1 first1 = m.begin1(), last1 = m.end1(), first2, last2;
  5.     for(typename T_M::const_iterator1 iM1 = first1; iM1 != last1; iM1++){
  6.       first2 = iM1.begin();
  7.       last2 = iM1.end();
  8.       for(typename T_M::const_iterator2 iM2 = first2; iM2 != last2; iM2++){
  9. v(iM2.index1()*m.size2() + iM2.index2()) = (*iM2);
  10.       }
  11.     }
  12.   }


 
afin de faire  
 

Code :
  1. boost::numeric::ublas::coordinate_vector a(n), b(p), r(n*p);
  2. boost::numeric::ublas::coordinate_matrix<double> tmp = outer_prod(a,b);
  3. 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 ?

Reply

Marsh Posté le 12-01-2011 à 18:00:08   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed