00001
00002
00003
00004
00005
00006
00007
00008 * \todo Add overloading of operators
00009 * \todo Reference cammva documentation
00010 */
00011
00012
00013 #ifndef MATRIX_H
00014 #define MATRIX_H
00015
00016 #include <iostream>
00017
00018 #include "cammva.h"
00019
00020 #include <math.h>
00021
00022 namespace O_SESSAME {
00023
00024 const int MatrixIndexBase = 1;
00025 const int VectorIndexBase = 1;
00026 const int MatrixRowsIndex = 1;
00027 const int MatrixColsIndex = 2;
00028 typedef CAMdoubleMatrix Matrix;
00029 typedef CAMdoubleVector Vector;
00030
00031
00032
00033
00034 inline Vector Vabs( Vector _vector )
00035 {
00036 int num = _vector.getIndexCount( );
00037 Vector outVector(num);
00038 for( int ii=1; ii <= num; ii++ )
00039 {
00040 if( _vector(ii) < 0 )
00041 {
00042 outVector(ii) = fabs( _vector(ii) );
00043 }
00044 else
00045 {
00046 outVector(ii) = _vector(ii);
00047 }
00048 }
00049 return( outVector );
00050 }
00051
00052
00053
00054
00055
00056 inline Matrix eye(int _rowColumns)
00057 {
00058 Matrix eyeOutput(_rowColumns,_rowColumns);
00059 eyeOutput.setToValue(0.0);
00060 for(int ii = MatrixIndexBase;ii < _rowColumns + MatrixIndexBase; ++ii)
00061 eyeOutput(ii,ii) = 1.0;
00062 return eyeOutput;
00063 }
00064
00065
00066
00067
00068
00069 inline double trace(const Matrix &_inMatrix)
00070 {
00071 double Sum = 0;
00072 for(int ii = MatrixIndexBase;ii < _inMatrix[MatrixRowsIndex].getIndexCount() + MatrixIndexBase; ++ii)
00073 Sum += _inMatrix(ii,ii);
00074 return Sum;
00075 }
00076
00077
00078
00079
00080
00081
00082 inline double norm2(const Vector &_inVector)
00083 {
00084 double Sum = 0;
00085 for(int ii = VectorIndexBase;ii < _inVector.getIndexCount() + VectorIndexBase; ++ii)
00086 Sum += _inVector(ii) * _inVector(ii);
00087 return sqrt(Sum);
00088 }
00089
00090
00091
00092
00093
00094 inline void normalize(Vector &_inVector)
00095 {
00096 _inVector /= norm2(_inVector);
00097 return;
00098 }
00099
00100
00101
00102
00103
00104
00105 inline double normInf(const Vector &_inVector)
00106 {
00107 return _inVector.maxAbs();
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 inline Matrix skew(const Vector &_inVector)
00125 {
00126 Matrix Rout(3,3);
00127 Rout.setToValue(0.0);
00128 Rout(MatrixIndexBase+0,MatrixIndexBase+1) =
00129 -_inVector(VectorIndexBase+2);
00130 Rout(MatrixIndexBase+0,MatrixIndexBase+2) =
00131 _inVector(VectorIndexBase+1);
00132 Rout(MatrixIndexBase+1,MatrixIndexBase+0) =
00133 _inVector(VectorIndexBase+2);
00134 Rout(MatrixIndexBase+1,MatrixIndexBase+2) =
00135 -_inVector(VectorIndexBase+0);
00136 Rout(MatrixIndexBase+2,MatrixIndexBase+0) =
00137 -_inVector(VectorIndexBase+1);
00138 Rout(MatrixIndexBase+2,MatrixIndexBase+1) =
00139 _inVector(VectorIndexBase+0);
00140 return Rout;
00141 }
00142
00143
00144
00145
00146
00147
00148
00149 inline Vector crossP(const Vector &_v1, const Vector &_v2)
00150 {
00151 return skew(_v1) * _v2;
00152 }
00153 }
00154 #endif
00155
00156