FullVector.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. /**
  2. * @file FullVector.cpp
  3. * @brief non sparse vector
  4. * @author Erik Rodner
  5. * @date 05/11/2008
  6. */
  7. #include <math.h>
  8. #include <assert.h>
  9. #include <string.h>
  10. #include <iostream>
  11. #include <algorithm>
  12. #include <limits>
  13. #include "vislearning/math/mathbase/FullVector.h"
  14. #include <stdio.h>
  15. #include "core/basics/StringTools.h"
  16. // whether to throw a exception when we divide by zero
  17. #undef FULLVECTOR_THROW_NORMALIZATION_EXCEPTION
  18. using namespace OBJREC;
  19. using namespace NICE;
  20. using namespace std;
  21. FullVector::FullVector ( const map<int, double> & mymap )
  22. {
  23. length = 0;
  24. for ( map<int, double>::const_iterator i = mymap.begin();
  25. i != mymap.end(); i++ )
  26. {
  27. int k = i->first;
  28. if ( k + 1 > length )
  29. length = k + 1;
  30. }
  31. data = new double[length];
  32. memset ( ( void * ) data, 0, sizeof ( double ) *length );
  33. for ( map<int, double>::const_iterator i = mymap.begin();
  34. i != mymap.end(); i++ )
  35. {
  36. int k = i->first;
  37. double v = i->second;
  38. data[k] = v;
  39. }
  40. }
  41. FullVector::FullVector ( const map<short, double> & mymap )
  42. {
  43. length = 0;
  44. for ( map<short, double>::const_iterator i = mymap.begin();
  45. i != mymap.end(); i++ )
  46. {
  47. int k = ( int ) i->first;
  48. if ( k + 1 > length )
  49. length = k + 1;
  50. }
  51. data = new double[length];
  52. memset ( ( void * ) data, 0, sizeof ( double ) *length );
  53. for ( map<short, double>::const_iterator i = mymap.begin();
  54. i != mymap.end(); i++ )
  55. {
  56. int k = i->first;
  57. double v = i->second;
  58. data[k] = v;
  59. }
  60. }
  61. FullVector::FullVector ( const FullVector & v )
  62. {
  63. length = v.length;
  64. if ( length == 0 )
  65. data = NULL;
  66. else {
  67. data = new double[length];
  68. memset ( ( void * ) data, 0, sizeof ( double ) *length );
  69. for ( int i = 0 ; i < length ; i++ )
  70. data[i] = v.data[i];
  71. }
  72. }
  73. FullVector::FullVector ()
  74. {
  75. length = 0;
  76. data = NULL;
  77. }
  78. FullVector::FullVector ( int _length )
  79. {
  80. length = _length;
  81. if ( length > 0 )
  82. {
  83. data = new double[length];
  84. memset ( ( void * ) data, 0, sizeof ( double ) *length );
  85. } else {
  86. data = NULL;
  87. }
  88. }
  89. FullVector::~FullVector ()
  90. {
  91. if ( data != NULL )
  92. delete [] data;
  93. }
  94. void FullVector::set ( double val )
  95. {
  96. for ( int i = 0 ; i < length ; i++ )
  97. data[i] = val;
  98. }
  99. void FullVector::reinit ( int _length )
  100. {
  101. if ( data != NULL ) {
  102. delete [] data;
  103. }
  104. length = _length;
  105. data = new double [ length ];
  106. memset ( ( void * ) data, 0, sizeof ( double ) *length );
  107. }
  108. void FullVector::add ( const FullVector & v )
  109. {
  110. add ( v, 1.0 );
  111. }
  112. double & FullVector::operator[] ( int i )
  113. {
  114. assert ( i < length );
  115. return data[i];
  116. }
  117. const double & FullVector::operator[] ( int i ) const
  118. {
  119. assert ( i < length );
  120. return data[i];
  121. }
  122. void FullVector::add ( const FullVector & v, double lambda )
  123. {
  124. assert ( v.length >= length );
  125. for ( int i = 0 ; i < v.length ; i++ )
  126. data[i] += v.data[i] * lambda;
  127. }
  128. void FullVector::add ( double beta )
  129. {
  130. for ( int i = 0 ; i < length; i++ )
  131. data[i] += beta;
  132. }
  133. void FullVector::divide ( const FullVector & v )
  134. {
  135. assert ( v.length >= length );
  136. for ( int i = 0 ; i < length ; i++ )
  137. {
  138. if ( fabs ( data[i] ) < 10e-11 ) continue;
  139. double value = v.data[i];
  140. if ( fabs ( value ) < 10e-11 ) {
  141. fprintf ( stderr, "FullVector::divide: Division by Zero !\n" );
  142. exit ( -1 );
  143. } else {
  144. data[i] /= value;
  145. }
  146. }
  147. }
  148. void FullVector::multiply ( const FullVector & v )
  149. {
  150. assert ( v.length >= length );
  151. for ( int i = 0 ; i < length ; i++ )
  152. {
  153. data[i] *= v.data[i];
  154. }
  155. }
  156. void FullVector::multiply ( double val )
  157. {
  158. for ( int i = 0 ; i < length ; i++ )
  159. data[i] *= val;
  160. }
  161. void FullVector::restore ( istream & is, int format )
  162. {
  163. std::string tag;
  164. is >> tag;
  165. if ( tag != "SVECTOR" ) {
  166. fprintf ( stderr, "FullVector: format error !\n" );
  167. }
  168. const int bufsize = 1024 * 1024;
  169. char *buf = new char[bufsize];
  170. std::string buf_s;
  171. vector<string> elements;
  172. vector<string> pair;
  173. elements.clear();
  174. is.get ( buf, bufsize );
  175. buf_s = buf;
  176. if ( buf_s.size() <= 0 )
  177. return;
  178. StringTools::split ( buf_s, ' ', elements );
  179. if ( elements.size() <= 1 )
  180. return;
  181. reinit ( elements.size() - 1 );
  182. size_t l = 0;
  183. // skip first element because of white space
  184. for ( vector<string>::const_iterator i = elements.begin() + 1;
  185. i != elements.end();
  186. i++, l++ )
  187. {
  188. pair.clear();
  189. StringTools::split ( *i, ':', pair );
  190. if ( pair.size() == 2 )
  191. {
  192. double val = atof ( pair[1].c_str() );
  193. ( *this ) [l] = val;
  194. }
  195. }
  196. delete [] buf;
  197. }
  198. void FullVector::store ( ostream & os, int format ) const
  199. {
  200. os << "SVECTOR ";
  201. for ( int i = 0 ; i < length ; i++ )
  202. {
  203. os << i << ":" << data[i] << " ";
  204. }
  205. os << "END" << endl;
  206. }
  207. void FullVector::clear ()
  208. {
  209. if ( length != 0 )
  210. memset ( data, 0x0, sizeof ( double ) *length );
  211. }
  212. double FullVector::sum () const
  213. {
  214. double sumv = 0.0;
  215. for ( int i = 0 ; i < length ; i++ )
  216. sumv += data[i];
  217. return sumv;
  218. }
  219. void FullVector::normalize ()
  220. {
  221. double sum = 0;
  222. for ( int i = 0 ; i < length ; i++ )
  223. sum += data[i];
  224. #ifdef FULLVECTOR_THROW_NORMALIZATION_EXCEPTION
  225. assert ( fabs ( sum ) > 1e-10 );
  226. #endif
  227. if ( fabs ( sum ) < 1e-10 ) {
  228. //fprintf (stderr, "WARNING: normalization failed !\n");
  229. for ( int i = 0 ; i < length ; i++ )
  230. data[i] = 0.0;
  231. } else {
  232. for ( int i = 0 ; i < length ; i++ )
  233. data[i] /= sum;
  234. }
  235. }
  236. void FullVector::addMap ( const map<int, int> & v, double lambda )
  237. {
  238. for ( map<int, int>::const_iterator v_it = v.begin();
  239. v_it != v.end();
  240. v_it++ )
  241. {
  242. int i = v_it->first;
  243. assert ( i < length );
  244. data[i] += v_it->second * lambda;
  245. }
  246. }
  247. void FullVector::addMap ( const map<int, double> & v, double lambda )
  248. {
  249. for ( map<int, double>::const_iterator v_it = v.begin();
  250. v_it != v.end();
  251. v_it++ )
  252. {
  253. int i = v_it->first;
  254. assert ( i < length );
  255. data[i] += v_it->second * lambda;
  256. }
  257. }
  258. int FullVector::maxElement () const
  259. {
  260. int maxindex = 0;
  261. double max = - numeric_limits<double>::max();
  262. for ( int i = 0 ; i < length ; i++ )
  263. {
  264. if ( data[i] > max )
  265. {
  266. maxindex = i;
  267. max = data[i];
  268. }
  269. }
  270. return maxindex;
  271. }
  272. int FullVector::maxElementExclusive ( int key ) const
  273. {
  274. int maxindex = ( key == 0 ) ? 1 : 0;
  275. double max = - numeric_limits<double>::max();
  276. for ( int i = 0 ; i < length ; i++ )
  277. {
  278. double val = data[i];
  279. if ( ( i != key ) && ( val > max ) )
  280. {
  281. maxindex = i;
  282. max = val;
  283. }
  284. }
  285. return maxindex;
  286. }
  287. double FullVector::entropy () const
  288. {
  289. double entropy = 0.0;
  290. double sum = 0.0;
  291. for ( int i = 0 ; i < length ; i++ )
  292. {
  293. double val = data[i];
  294. if ( val <= 0.0 ) continue;
  295. entropy -= val * log ( val );
  296. sum += val;
  297. }
  298. entropy /= sum;
  299. entropy += log ( sum );
  300. return entropy;
  301. }
  302. void FullVector::getSortedIndices ( vector<int> & indizes ) const
  303. {
  304. vector< pair<double, int> > tmp;
  305. for ( int i = 0 ; i < length ; i++ )
  306. if ( fabs ( data[i] ) > 10e-11 )
  307. tmp.push_back ( pair<double, int> ( data[i], i ) );
  308. sort ( tmp.begin(), tmp.end() );
  309. for ( vector<pair<double, int> >::const_iterator j = tmp.begin();
  310. j != tmp.end(); j++ )
  311. indizes.push_back ( j->second );
  312. }
  313. double FullVector::max () const
  314. {
  315. double max = - numeric_limits<double>::max();
  316. for ( int i = 0 ; i < length ; i++ )
  317. {
  318. if ( data[i] > max )
  319. max = data[i];
  320. }
  321. return max;
  322. }
  323. double FullVector::min () const
  324. {
  325. double min = numeric_limits<double>::max();
  326. for ( int i = 0 ; i < length ; i++ )
  327. {
  328. if ( data[i] < min )
  329. min = data[i];
  330. }
  331. return min;
  332. }
  333. double FullVector::get ( size_t i ) const
  334. {
  335. assert ( ( int ) i < length );
  336. return data[i];
  337. }
  338. void FullVector::operator= ( const FullVector & v )
  339. {
  340. if ( data != NULL )
  341. delete [] data;
  342. length = v.length;
  343. if ( length == 0 )
  344. data = NULL;
  345. else {
  346. data = new double[length];
  347. memset ( ( void * ) data, 0, sizeof ( double ) *length );
  348. for ( int i = 0 ; i < length ; i++ )
  349. data[i] = v.data[i];
  350. }
  351. }