68 #ifndef __INCLUDE_MIST_MATRIX__
69 #define __INCLUDE_MIST_MATRIX__
73 #ifndef __INCLUDE_MIST_H__
94 _MIST_CONST(
bool, value,
false );
97 #if defined(__MIST_MSVC__) && __MIST_MSVC__ < 7
99 #define IS_COMPLEX( type ) \
101 struct is_complex< std::complex< type > >\
103 enum{ value = true };\
107 IS_COMPLEX(
unsigned char)
108 IS_COMPLEX(
unsigned short)
109 IS_COMPLEX(
unsigned int)
110 IS_COMPLEX(
unsigned long)
111 IS_COMPLEX(
signed char)
112 IS_COMPLEX(
signed short)
113 IS_COMPLEX(
signed int)
114 IS_COMPLEX(
signed long)
119 IS_COMPLEX(
long double)
126 struct is_complex< std::complex< T > >
128 _MIST_CONST(
bool, value,
true );
136 template <
class T >
static bool le(
const T &v1,
const T &v2 ){
return( v1 <= v2 ); }
137 template <
class T >
static bool ge(
const T &v1,
const T &v2 ){
return( v1 >= v2 ); }
138 template <
class T >
static bool lt(
const T &v1,
const T &v2 ){
return( v1 < v2 ); }
139 template <
class T >
static bool gt(
const T &v1,
const T &v2 ){
return( v1 > v2 ); }
140 template <
class T >
static bool eq(
const T &v1,
const T &v2 ){
return( v1 == v2 ); }
141 template <
class T >
static bool eq(
const T &v1,
const T &v2,
const double delta ){
return( std::abs( v1 - v2 ) < delta ); }
142 template <
class T >
static bool is_zero(
const T &v ){
return( v == T( ) ); }
146 struct value_compare< true >
149 static bool lt(
const T &v1,
const T &v2 )
151 if( v1.real( ) < v2.real( ) )
155 else if( v1.real( ) > v2.real( ) )
159 else if( v1.imag( ) < v2.imag( ) )
168 template <
class T >
static bool ge(
const T &v1,
const T &v2 ){
return( !lt( v1, v2 ) ); }
169 template <
class T >
static bool le(
const T &v1,
const T &v2 ){
return( !lt( v2, v1 ) ); }
170 template <
class T >
static bool gt(
const T &v1,
const T &v2 ){
return( lt( v2, v1 ) ); }
171 template <
class T >
static bool eq(
const T &v1,
const T &v2 )
173 return( v1.real( ) == v2.real( ) && v1.imag( ) == v2.imag( ) );
175 template <
class T >
static bool eq(
const T &v1,
const T &v2,
const double delta )
177 return( std::abs( v1.real( ) - v2.real( ) ) < delta && std::abs( v1.imag( ) - v2.imag( ) ) < delta );
179 template <
class T >
static bool is_zero(
const T &v ){
return( v.real( ) == 0 && v.imag( ) == 0 ); }
183 template<
class T > std::complex< T > conjugate(
const std::complex< T > &c ) {
return std::conj( c ); }
184 template<
class T >
const T &conjugate(
const T &c ) {
return c; }
196 template <
class T,
class Allocator = ::std::allocator< T > >
222 template <
class TT,
class AAllocator = std::allocator< TT > >
253 if( base::resize( num ) )
281 if( base::resize( nrows * ncols ) )
307 if( base::resize( nrows * ncols, val ) )
335 if( nrows_ <= static_cast< difference_type >( row ) || nrows_ < static_cast< difference_type >( row + nrows ) )
339 else if( ncols_ <= static_cast< difference_type >( col ) || ncols_ < static_cast< difference_type >( col + ncols ) )
343 else if( nrows_ == nrows && ncols_ == ncols )
350 nrows = nrows_ - row;
354 ncols = ncols_ - col;
357 if( out.
resize( nrows, ncols ) )
360 pointer po = out.paccess( 0, 0 );
363 po = base::allocator_.copy_objects( pi, nrows, po );
387 if( base::is_memory_shared( ) )
391 return( o.
trim( *
this, row, col, nrows, ncols ) );
397 if( this->trim( o, row, col, nrows, ncols ) )
421 if( base::swap( m ) )
427 m.size1_ = _dmy_size1;
428 m.size2_ = _dmy_size2;
590 typedef __numeric__::value_compare< __numeric__::is_complex< value_type >::value > value_compare;
593 if( value_compare::lt( s1, s2 ) )
596 if( value_compare::lt( s1, s3 ) )
598 if( value_compare::lt( s2, s3 ) )
621 if( value_compare::lt( s1, s3 ) )
629 if( value_compare::lt( s2, s3 ) )
658 o( 0, 0 ) = a00; o( 0, 1 ) = a01; o( 0, 2 ) = a02; o( 0, 3 ) = a03;
659 o( 1, 0 ) = a10; o( 1, 1 ) = a11; o( 1, 2 ) = a12; o( 1, 3 ) = a13;
660 o( 2, 0 ) = a20; o( 2, 1 ) = a21; o( 2, 2 ) = a22; o( 2, 3 ) = a23;
661 o( 3, 0 ) = a30; o( 3, 1 ) = a31; o( 3, 2 ) = a32; o( 3, 3 ) = a33;
675 o( 0, 0 ) = a00; o( 0, 1 ) = a01; o( 0, 2 ) = a02; o( 0, 3 ) = a03;
676 o( 1, 0 ) = a10; o( 1, 1 ) = a11; o( 1, 2 ) = a12; o( 1, 3 ) = a13;
677 o( 2, 0 ) = a20; o( 2, 1 ) = a21; o( 2, 2 ) = a22; o( 2, 3 ) = a23;
692 o( 0, 0 ) = a00; o( 0, 1 ) = a01; o( 0, 2 ) = a02;
693 o( 1, 0 ) = a10; o( 1, 1 ) = a11; o( 1, 2 ) = a12;
694 o( 2, 0 ) = a20; o( 2, 1 ) = a21; o( 2, 2 ) = a22;
695 o( 3, 0 ) = a30; o( 3, 1 ) = a31; o( 3, 2 ) = a32;
722 o( 0, 0 ) = a00; o( 0, 1 ) = a01; o( 0, 2 ) = a02;
723 o( 1, 0 ) = a10; o( 1, 1 ) = a11; o( 1, 2 ) = a12;
724 o( 2, 0 ) = a20; o( 2, 1 ) = a21; o( 2, 2 ) = a22;
749 o( 0, 0 ) = a00; o( 0, 1 ) = a01;
750 o( 1, 0 ) = a10; o( 1, 1 ) = a11;
769 size_type size = rows < cols ? rows : cols;
781 return(
matrix( rows, cols ) );
788 matrix o( size1_, size2_ );
800 matrix o( size2_, size1_ );
805 o( r, c ) = m( c, r );
815 matrix o( size2_, size1_ );
820 o( r, c ) = __numeric__::conjugate( m( c, r ) );
844 template <
class TT,
class AAlocator >
848 #if _CHECK_ARRAY_OPERATION_ != 0
852 ::std::cerr <<
"can't add arrays." << ::std::endl;
856 for(
size_type i = 0 ; i < m1.
size( ) ; i++ ) m1[i] += static_cast< T >( m2[i] );
869 template <
class TT,
class AAlocator >
873 #ifdef _CHECK_ARRAY_OPERATION_
877 ::std::cerr <<
"can't subtract matrixs." << ::std::endl;
881 for(
size_type i = 0 ; i < m1.
size( ) ; i++ ) m1[i] -= static_cast< T >( m2[i] );
894 template <
class TT,
class AAlocator >
899 #if defined( _CHECK_MATRIX_OPERATION_ ) && _CHECK_MATRIX_OPERATION_ != 0
903 ::std::cerr <<
"can't multiply matrices." << ::std::endl;
908 typedef __numeric__::value_compare< __numeric__::is_complex< value_type >::value > value_compare;
913 int nCols =
static_cast< int >( mat.cols( ) );
915 #pragma omp parallel for schedule( guided )
916 for(
int c = 0 ; c < nCols ; c++ )
921 if( !value_compare::is_zero( val ) )
925 for(
size_type r = 0 ; r < mat.rows( ) ; r++ )
927 pm0[ r ] += pm1[ r ] * val;
935 for( c = 0 ; c < mat.cols( ) ; c++ )
937 for( t = 0 ; t < m1.
cols( ) ; t++ )
940 if( !value_compare::is_zero( val ) )
944 for( r = 0 ; r < mat.rows( ) ; r++ )
946 pm0[ r ] += pm1[ r ] * val;
971 for( i = 0 ; i < size ; i++ ) m( i, i ) += val;
988 for( i = 0 ; i < size ; i++ ) m( i, i ) -= val;
1020 #if defined( _CHECK_MATRIX_OPERATION_ ) && _CHECK_MATRIX_OPERATION_ != 0
1024 ::std::cerr <<
"zero division occured." << ::std::endl;
1041 bool is_equal(
const matrix &a,
const double delta )
1043 typedef __numeric__::value_compare< __numeric__::is_complex< value_type >::value > value_compare;
1045 if( rows( ) != a.
rows( ) || cols( ) != a.
cols( ) )
1050 for(
size_type i = 0 ; i < base::size( ) ; i++ )
1052 if( !value_compare::eq(
operator []( i ), a[ i ], delta ) )
1070 if( rows( ) != a.
rows( ) || cols( ) != a.
cols( ) )
1075 for(
size_type i = 0 ; i < base::size( ) ; i++ )
1077 if(
operator []( i ) != a[ i ] )
1093 bool operator !=(
const matrix &a )
const {
return( !( *
this == a ) ); }
1107 template <
class TT,
class AAlocator >
1110 base::operator =( o );
1112 if( base::empty( ) )
1114 size1_ = size2_ = 0;
1118 size1_ = o.
size1( );
1119 size2_ = o.
size2( );
1136 if(
this == &o )
return( *
this );
1138 base::operator =( o );
1140 if( base::empty( ) )
1142 size1_ = size2_ = 0;
1146 size1_ = o.
size1( );
1147 size2_ = o.
size2( );
1163 pointer paccess( size_type r, size_type c )
1165 return( base::data_ + r + c * size1_ );
1175 const_pointer paccess( size_type r, size_type c )
const
1177 return( base::data_ + r + c * size1_ );
1193 _CHECK_ACCESS_VIOLATION2U_( r, c )
1194 return( base::data_[ r + c * size1_ ] );
1208 _CHECK_ACCESS_VIOLATION2U_( r, c )
1209 return( base::data_[ r + c * size1_ ] );
1223 _CHECK_ACCESS_VIOLATION2U_( r, c )
1224 return( base::data_[ r + c * size1_ ] );
1238 _CHECK_ACCESS_VIOLATION2U_( r, c )
1239 return( base::data_[ r + c * size1_ ] );
1248 explicit matrix(
const Allocator &a ) :
base( a ), size2_( 0 ), size1_( 0 ) {}
1254 if( base::empty( ) ) size1_ = size2_ = 0;
1260 if( base::empty( ) ) size1_ = size2_ = 0;
1267 if( base::empty( ) ) size1_ = size2_ = 0;
1273 if( base::empty( ) ) size1_ = size2_ = 0;
1282 if( base::empty( ) ) size1_ = size2_ = 0;
1288 if( base::empty( ) ) size1_ = size2_ = 0;
1296 template <
class TT,
class AAlocator >
1299 if( base::empty( ) ) size1_ = size2_ = 0;
1306 if( base::empty( ) ) size1_ = size2_ = 0;
1325 template <
class T,
class Allocator >
1326 inline ::std::ostream &operator <<( ::std::ostream &out, const matrix< T, Allocator > &m )
1329 for( r = 0 ; r < m.
rows( ) ; r++ )
1335 for( c = 0 ; c < m.
cols( ) ; c++ )
1338 if( c != m.
cols( ) - 1 ) out <<
", ";
1373 template <
class T,
class Allocator >
1387 template <
class T,
class Allocator >
1401 template <
class T,
class Allocator >
1417 template <
class T,
class Allocator >
1432 template <
class T,
class Allocator >
1449 template <
class T,
class Allocator >
1464 template <
class T,
class Allocator >
1480 template <
class T,
class Allocator >
1495 template <
class T,
class Allocator >
1511 template <
class T,
class Allocator >
1521 #endif // __INCLUDE_MIST_MATRIX__