inlib
1.2.0
|
common array ///////////////////////////////////////////////////////////// More...
Public Member Functions | |
kronecker (unsigned int a_order) |
common array /////////////////////////////////////////////////////////////
inlib::kronecker< T >::kronecker | ( | unsigned int | a_order | ) | [inline] |
Definition at line 522 of file array.
:array<T>(a_order,a_order){ // epsilon(i1,i2,....in) with n = a_order and i in [0,n[. // Then an Array of a_order * a_order. unsigned int index = 0; typedef typename std::vector<unsigned int> uints_t; uints_t is(a_order); std::vector<T>& vec = array<T>::vector(); typedef typename std::vector<T>::iterator vec_it_t; vec_it_t it = vec.begin(); for(;it!=vec.end();++it,index++) { if(!array<T>::indices(index,is)) return; //FIXME throw. bool good = true; {for(unsigned iaxis=0;iaxis<a_order;iaxis++) { unsigned int ival = is[iaxis]; for(unsigned iaxis2=iaxis+1;iaxis2<a_order;iaxis2++) { if(is[iaxis2]==ival) { good = false; break; } } if(!good) break; }} if(!good) continue; // All indicies are different. unsigned int n = 0; for(unsigned iaxis=0;iaxis<a_order;) { unsigned int ival = is[iaxis]; if(ival!=iaxis) { // Swap and add one permutation : unsigned int old = is[ival]; is[ival] = ival; is[iaxis] = old; n +=1; } else { iaxis++; } } {unsigned int n_2 = n/2; if(2*n_2==n) (*it) = array<T>::one(); else (*it) = array<T>::minus_one();} } }