📄 implementation.h
字号:
inline Index SymmetricSkyline::map_fast( Index const& row, Index const& col ) const { return my_diag(col)+col-row; } // ---------------------------------------------------------------------- // map() // ---------------------------------------------------------------------- Index SymmetricSkyline::map( Index const& row, Index const& col ) const { assert( MinIndex <= row && row <= my_n ); assert( MinIndex <= col && col <= my_n ); if( col >= row ) { if( col-row < my_haut(col) ) return map_fast(row,col); else return 0; } else { if( row-col < my_haut(row) ) return map_fast(col,row); else return 0; } } // ---------------------------------------------------------------------- // firstInRow() // ---------------------------------------------------------------------- Index SymmetricSkyline::firstInRow(Index const i) const { assert( MinIndex <= i && i <= my_n ); return i; } // ---------------------------------------------------------------------- // lastInRow() // ---------------------------------------------------------------------- Index SymmetricSkyline::lastInRow(Index const i) const { Index k; assert( MinIndex <= i && i <= my_n ); for( k=my_n ; i<k ; --k ) if( map(i,k) != 0 ) return k; return i; } // ---------------------------------------------------------------------- // firstInCol() // ---------------------------------------------------------------------- Index SymmetricSkyline::firstInCol( Index const j ) const { assert( MinIndex <= j && j <= my_n ); return j-my_haut(j)+1; } // ---------------------------------------------------------------------- // lastInCol() // ---------------------------------------------------------------------- Index SymmetricSkyline::lastInCol( Index const j ) const { return j; } // ---------------------------------------------------------------------- // map_fast() // ---------------------------------------------------------------------- inline Index SymmetricSkylineIterator::map_fast( Index const& row, Index const& col ) const { return my_diag(col)+col-row; } // ---------------------------------------------------------------------- // map() // ---------------------------------------------------------------------- Index SymmetricSkylineIterator::map( Index const& row, Index const& col ) const { assert( MinIndex <= row && row <= my_n ); assert( MinIndex <= col && col <= my_n ); if( col >= row ) { if( col-row < my_haut(col) ) return map_fast(row,col); else return 0; } else { if( row-col < my_haut(row) ) return map_fast(col,row); else return 0; } } // ---------------------------------------------------------------------- // firstInRow() // ---------------------------------------------------------------------- Index SymmetricSkylineIterator::firstInRow() const { assert( MinIndex <= my_i && my_i <= my_n ); assert( MinIndex <= my_j && my_j <= my_p ); return my_i; } // ---------------------------------------------------------------------- // lastInRow() // ---------------------------------------------------------------------- Index SymmetricSkylineIterator::lastInRow() const { Index k; assert( MinIndex <= my_i && my_i <= my_n ); assert( MinIndex <= my_j && my_j <= my_p ); for( k=my_p ; my_i<k ; --k ) if( map(my_i,k) != 0 ) return k; return my_i; } // ---------------------------------------------------------------------- // firstInCol() // ---------------------------------------------------------------------- Index SymmetricSkylineIterator::firstInCol() const { assert( MinIndex <= my_i && my_i <= my_n ); assert( MinIndex <= my_j && my_j <= my_p ); return my_j-my_haut(my_j)+1; } // ---------------------------------------------------------------------- // lastInCol() // ---------------------------------------------------------------------- Index SymmetricSkylineIterator::lastInCol() const { return my_j; } // ---------------------------------------------------------------------- // incRow() // ---------------------------------------------------------------------- void SymmetricSkylineIterator::incRow() { ++my_i; if( my_i > my_n ) my_ok = false; else { my_j = firstInRow(); my_o = map(my_i,my_j); } } // ---------------------------------------------------------------------- // incCol() // ---------------------------------------------------------------------- void SymmetricSkylineIterator::incCol() { ++my_j; if( my_j > my_p ) my_ok = false; else { my_i = firstInCol(); my_o = map(my_i,my_j); } } // ---------------------------------------------------------------------- // operator++() // ---------------------------------------------------------------------- void SymmetricSkylineIterator::operator++() { // cerr << "DBG: IN DIAG: " << my_diag; // cerr << "DBG: IN HAUT: " << my_haut; // cerr << "DBG: IN : " // << " i=" << my_i << " j=" << my_j << " o=" << my_o << endl; // diagonal and upper part if( my_i <= my_j ) { // cerr << "DBG: diag+upper part" << endl; my_o++; if( my_o > my_last ) my_ok = false; else { // must find the matching i and j if( my_diag(my_j+1) == my_o ) { // cerr << "DBG: inc col" << endl; // ok we have change line number thus ++my_j; my_i = my_j; } else { // cerr << "DBG: dec lin" << endl; --my_i; } } } // cerr << "DBG: OUT: " // << " i=" << my_i // << " j=" << my_j // << " o=" << my_o // << endl; } void SymmetricSkyline::compute_profil( VectorUInt const& haut ) { Index i; Index n; assert( haut.rows() == my_haut.rows() ); assert( haut.cols() == my_haut.cols() ); assert( my_profil_is_set == false ); my_profil_is_set = true; // compute my_diag and my_haut n = haut.rows(); // affect haut for( i=1 ; i<=n ; ++i ) if( haut(i) == 0 ) my_haut(i) = 1; else if( haut(i) > i ) my_haut(i)= i; else my_haut(i) = haut(i); my_diag(1)=1; for( i=2 ; i<=n ; ++i ) my_diag(i) = my_diag(i-1)+my_haut(i-1); my_data_length = my_diag(n)+haut(n)-1; }; void SymmetricSkyline::compute_profil( MatrixUInt const& noda, MatrixUInt const& connex ) { // A FAIRE }; #ifdef HAVE_NAMESPACE}#endif#endif// end of SL_MATRIX_STRUCTURES_SSS_IMPLEMENTATION_H definition(s)// do not write anything after this line!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -