00001
00037 #ifndef INC_MI32_MIMATRIX_H
00038 #define INC_MI32_MIMATRIX_H
00039
00040 #ifndef INC_MI32_DOUBLEAR_H
00041 #include <mi32/doublear.h>
00042 #endif
00043
00044 #ifdef GEOMDLL
00045 #define CLASSEXPORT MI_DLLCLASSEXPORT
00046 #else
00047 #define CLASSEXPORT MI_DLLCLASSIMPORT
00048 #endif
00049
00051 class CLASSEXPORT MIMATRIX {
00052 public:
00053
00055 MIMATRIX ();
00056
00058 MIMATRIX (const MIMATRIX& rhs);
00059
00061 ~MIMATRIX ();
00062
00064 MIMATRIX& operator= (const MIMATRIX& rhs);
00065
00067 MIMATRIX& operator*= (
00068 double value
00069 ) { MultiplyScalar(value); return (*this); }
00070
00072 MIMATRIX& operator/= (
00073 double value
00074 ) { MultiplyScalar(1.0/value); return (*this); }
00075
00077 const MIMATRIX operator- (
00078 ) { return (MIMATRIX(OP_Negate,*this)); }
00079
00081 void Add (
00082 UINT32 row,
00083 UINT32 col,
00084 double value
00085 );
00086
00089 ERRVALUE Add (
00090 const MIMATRIX& matrix
00091 );
00092
00094 void AddScalar (
00095 double value
00096 );
00097
00108 double ComputeConditionNumber (
00109 ) const;
00110
00112 double ComputeDeterminant (
00113 ) const;
00114
00117 ERRVALUE ComputeEigen (
00118 MIMATRIX& EigenVectors,
00119 MIMATRIX& EigenValues
00120 ) const;
00121
00123 ERRVALUE ComputeInverse (
00124 MIMATRIX& result,
00125 UINT32 MaxIterations = 0,
00126 double MaxError = 0
00127 ) const;
00128
00130 double ComputeMaxAbsolute (
00131 ) const;
00132
00139 ERRVALUE ComputePseudoInverse (
00140 MIMATRIX& result,
00141 double tolerance = 0
00142 ) const;
00143
00151 ERRVALUE ComputeSVD (
00152 MIMATRIX& U,
00153 MIMATRIX& W,
00154 MIMATRIX& V
00155 ) const;
00156
00158 double ComputeTrace (
00159 ) const;
00160
00162 ERRVALUE Create (
00163 UINT32 Rows,
00164 UINT32 Cols,
00165 const double *values = 0
00166 );
00167
00169 ERRVALUE CreateDiagonal (
00170 UINT32 Size,
00171 double value
00172 );
00173
00177 ERRVALUE CreateDiagonal (
00178 const MIMATRIX& vector
00179 );
00180
00182 ERRVALUE CreateProduct (
00183 const MIMATRIX& left,
00184 const MIMATRIX& right
00185 );
00186
00188 ERRVALUE GetDiagonal (
00189 MIMATRIX& result
00190 ) const;
00191
00193 UINT32 GetNumColumns (
00194 ) const { return (m_Cols); }
00195
00197 UINT32 GetNumElements (
00198 ) const { return (m_values.GetNumItems()); }
00199
00201 UINT32 GetNumRows (
00202 ) const { return (m_Rows); }
00203
00205 double GetValueFast (
00206 UINT32 row,
00207 UINT32 col
00208 ) const { return (m_values[static_cast<int>(row*m_Cols+col)]); }
00209
00211 double GetValueValidated (
00212 UINT32 row,
00213 UINT32 col
00214 ) const;
00215
00218 double GetValueFast (
00219 UINT32 num
00220 ) const { return (m_values[static_cast<int>(num)]); }
00221
00224 double GetValueValidated (
00225 UINT32 num
00226 ) const;
00227
00229 void GetValues (
00230 double *values
00231 ) const;
00232
00235 bool IsEqual (
00236 const MIMATRIX& matrix,
00237 double tolerance = 0
00238 ) const;
00239
00241 bool IsDiagonal (
00242 double tolerance = 0
00243 ) const;
00244
00246 bool IsSameSize (
00247 const MIMATRIX& matrix
00248 ) const { return (m_Rows == matrix.m_Rows && m_Cols == matrix.m_Cols); }
00249
00252 bool IsSingular (
00253 ) const;
00254
00256 bool IsSymmetric (
00257 double tolerance = 0
00258 ) const;
00259
00261 bool IsVector (
00262 ) const { return (m_Rows == 1 || m_Cols == 1); }
00263
00265 ERRVALUE MultiplyLeft (
00266 const MIMATRIX& left
00267 );
00268
00270 ERRVALUE MultiplyRight (
00271 const MIMATRIX& right
00272 );
00273
00275 void MultiplyScalar (
00276 double value
00277 );
00278
00280 ERRVALUE ReplaceSubMatrix (
00281 UINT32 TgtStartRow,
00282 UINT32 TgtStartCol,
00283 const MIMATRIX& SrcMatrix,
00284 UINT32 SrcStartRow = 0,
00285 UINT32 SrcStartCol = 0,
00286 UINT32 NumRows = 0,
00287 UINT32 NumCols = 0
00288 );
00289
00292 ERRVALUE Resize (
00293 UINT32 Rows,
00294 UINT32 Cols
00295 );
00296
00300 void RotateClockwise (
00301 );
00302
00304 void SetScalar (
00305 double value
00306 );
00307
00309 void SetIdentity (
00310 );
00311
00313 void SetValueFast (
00314 UINT32 row,
00315 UINT32 col,
00316 double value
00317 ) { m_values[static_cast<int>(row*m_Cols+col)] = value; }
00318
00320 void SetValueValidated (
00321 UINT32 row,
00322 UINT32 col,
00323 double value
00324 );
00325
00328 void SetValueFast (
00329 UINT32 num,
00330 double value
00331 ) { m_values[static_cast<int>(num)] = value; }
00332
00335 void SetValueValidated (
00336 UINT32 num,
00337 double value
00338 );
00339
00341 void SetZero (
00342 ) { m_values.ClearItems(); }
00343
00348 ERRVALUE SolveLinear (
00349 const MIMATRIX& A,
00350 const MIMATRIX& B,
00351 double tolerance = 0
00352 );
00353
00355 ERRVALUE SolveLinearSVD (
00356 const MIMATRIX& U,
00357 const MIMATRIX& W,
00358 const MIMATRIX& V,
00359 const MIMATRIX& B,
00360 double tolerance = 0
00361 );
00362
00365 ERRVALUE Subtract (
00366 const MIMATRIX& matrix
00367 );
00368
00371 void Swap (
00372 MIMATRIX& other
00373 );
00374
00376 void Transpose (
00377 );
00378
00379 #ifndef GENERATING_DOXYGEN_OUTPUT
00380
00381 enum OP {
00382 OP_Add,
00383 OP_Subtract,
00384 OP_Multiply,
00385 OP_Negate
00386 };
00387
00388
00389 MIMATRIX (
00390 OP op,
00391 const MIMATRIX& lhs,
00392 const MIMATRIX& rhs
00393 );
00394
00395
00396 MIMATRIX (
00397 OP op,
00398 const MIMATRIX& lhs,
00399 double rhs = 0
00400 );
00401
00402 private:
00403
00404 DOUBLE_ARRAY<double> m_values;
00405 UINT32 m_Rows;
00406 UINT32 m_Cols;
00407
00408
00409 const double& element (
00410 UINT32 num
00411 ) const { return (m_values[static_cast<int>(num)]); }
00412
00413
00414 double& element (
00415 UINT32 num
00416 ) { return (m_values[static_cast<int>(num)]); }
00417
00418
00419 const double& element (
00420 UINT32 row,
00421 UINT32 col
00422 ) const { return (m_values[static_cast<int>(row*m_Cols+col)]); }
00423
00424
00425 double& element (
00426 UINT32 row,
00427 UINT32 col
00428 ) { return (m_values[static_cast<int>(row*m_Cols+col)]); }
00429
00430 ERRVALUE HouseholderReduction (MIMATRIX& E, MIMATRIX& D);
00431 ERRVALUE QLImplicit (MIMATRIX& E, MIMATRIX& D);
00432
00433 #endif // GENERATING_DOXYGEN_OUTPUT
00434 };
00435
00436
00438 inline const MIMATRIX operator+ (
00439 const MIMATRIX& lhs,
00440 const MIMATRIX& rhs
00441 ) { return (MIMATRIX(MIMATRIX::OP_Add,lhs,rhs)); }
00442
00444 inline const MIMATRIX operator- (
00445 const MIMATRIX& lhs,
00446 const MIMATRIX& rhs
00447 ) { return (MIMATRIX(MIMATRIX::OP_Subtract,lhs,rhs)); }
00448
00450 inline const MIMATRIX operator* (
00451 const MIMATRIX& lhs,
00452 const MIMATRIX& rhs
00453 ) { return (MIMATRIX(MIMATRIX::OP_Multiply,lhs,rhs)); }
00454
00456 inline const MIMATRIX operator* (
00457 const MIMATRIX& lhs,
00458 double rhs
00459 ) { return (MIMATRIX(MIMATRIX::OP_Multiply,lhs,rhs)); }
00460
00462 inline const MIMATRIX operator/ (
00463 const MIMATRIX& lhs,
00464 double rhs
00465 ) { return (MIMATRIX(MIMATRIX::OP_Multiply,lhs,1.0/rhs)); }
00466
00468 inline const MIMATRIX operator* (
00469 double lhs,
00470 const MIMATRIX& rhs
00471 ) { return (MIMATRIX(MIMATRIX::OP_Multiply,rhs,lhs)); }
00472
00473
00474 #undef CLASSEXPORT
00475
00476 #endif // INC_MI32_MIMATRIX_H
00477