00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 #ifndef MATRIX_H_
00009 #define MATRIX_H_
00010 
00011 #include "InvTypes.h"
00012 #include "objectfits.h"
00013 #include "utilities.h"
00014 #include <complex.h>
00015 
00016 
00021 typedef enum {REAL, COMPLEX, BOOL} MatrixType;
00022 
00027 typedef enum  {ROW_MAJOR, COL_MAJOR} MatrixOrder;
00028 
00034 typedef struct {
00035   void *data;                   
00036   int nRow;                             
00037   int nCol;                             
00038   MatrixType mtype;             
00039   MatrixOrder morder;   
00040 } MATRIX;
00041 
00046 typedef struct {
00047   Float *data;  
00048   int n;                
00049 } VECTOR;
00050 
00051 
00052 
00053 MATRIX newMatrix(int r, int c);
00054 MATRIX newMatrixI(int r, int c, void *Idata, MatrixType mType);
00055 MATRIX newComplexMatrix(int r, int c);
00056 MATRIX newMatrixG(int r, int c, MatrixType mType);
00057 MATRIX newMatrixGI(int r, int c, void *Idata, MatrixType mType);
00058 
00059 void freeMatrix(MATRIX m);
00060 
00061 VECTOR newVector(int n);
00062 void freeVector(VECTOR v);
00063 
00064 MATRIX matrix_copy(MATRIX m);
00065 
00066 unsigned int setRandomSeedToTime();
00067 unsigned int setRandomSeed(unsigned int seed);
00068 
00069 MATRIX newRandomMatrix(int r, int c);
00070 
00071 VECTOR multiplyMV(MATRIX m, VECTOR v);
00072 
00073 MATRIX multiplyMM2(char TransA, char TransB, MATRIX A, MATRIX B);
00074 MATRIX multiplyMM2NoForceC(char TransA, char TransB, MATRIX A, MATRIX B);
00075 MATRIX multiplyMMFull(char TransA, char TransB, Float alpha, Float beta, MATRIX A, MATRIX B);
00076 
00081 MATRIX multiplyMD(MATRIX m, VECTOR d);
00082 
00083 
00084 
00085 MATRIX multiplyDM(VECTOR d, MATRIX m);
00086 
00087 VECTOR multiplyDV(VECTOR d, VECTOR v);
00088 
00089 MATRIX multiplyScalar(MATRIX m, Float scalar);
00090 MATRIX multiplyScalarZ(MATRIX m, FloatComplex scalar);
00091 MATRIX starMultiply(MATRIX P, MATRIX Q);
00092 
00093 MATRIX multiplyMMplusC(MATRIX A, MATRIX B, Float beta, MATRIX C);
00094 MATRIX multiplyMMplusCZ(MATRIX A, MATRIX B, Float beta, MATRIX C);
00095 MATRIX multiplyABplusC(char TransA, char TransB, MATRIX A, MATRIX B, Float beta, MATRIX C);
00096 
00097 MATRIX toMatrix(fits2d f);
00098 VECTOR toVector(fits2d f);
00099 
00100 fits2d toFitsObject(VECTOR v);
00101 fits2d MatrixToFitsObject(MATRIX m);
00102 fits3d MatrixToFits3dObject(MATRIX m);
00103 
00104 Float* toRowMajor(Float* A, int R, int C);
00105 Float* toColumnMajor(Float* A, int R, int C);
00106 
00107 MATRIX toRowMajor2(MATRIX m);
00108 MATRIX toColumnMajor2(MATRIX m);
00109 
00110 MATRIX expandDiagonalMatrix(VECTOR v);
00111 
00112 MATRIX transpose(MATRIX m);
00113 
00114 MATRIX conjugate(MATRIX m);
00115 
00116 MATRIX inverseD(MATRIX m);
00117 
00118 MATRIX inverse(MATRIX m);
00119 MATRIX inverseOld(MATRIX m);
00120 
00121 MATRIX Cholesky(MATRIX m);
00122 
00123 bool isIdentity(MATRIX m);
00124 
00125 MATRIX ConvertToReal(MATRIX m);
00126 
00127 MATRIX ConvertToComplex(MATRIX m);
00128 
00129 VECTOR MatrixToVector(MATRIX m);
00130 
00131 MATRIX VectorToMatrix_Column(VECTOR v);
00132 
00133 MATRIX reduceMatrix(MATRIX from, VECTOR depths, int areRows) ;
00134 
00135 void insertVector(Float* to, VECTOR from);
00136 
00137 void APlusLambdaB(MATRIX A, Float lambda, MATRIX B, MATRIX C);
00138 
00139 FloatComplex Norm2(MATRIX m);
00140 
00141 MATRIX BItimesV(MATRIX B, MATRIX V);
00142 
00143 int matrix_equal(MATRIX a, MATRIX b);
00144 
00145 void setToNaN(VECTOR v);
00146 void setToNaNMatrix(MATRIX m);
00147 
00148 MATRIX pad(MATRIX a, int newRow, int newCol, Float value);
00149 MATRIX embed(MATRIX a, int factor);
00150 void splitMatrix(MATRIX m, MATRIX *real, MATRIX *imag);
00151 void mergeMatrix(MATRIX *m, MATRIX real, MATRIX imag);
00152 
00153 MATRIX zeroScatterer(MATRIX K, int scatterer, int Nz, int NBeta);
00154 MATRIX scaleScatterer(MATRIX K, Float factor, int scatterer, int Nz, int NBeta);
00155 MATRIX scaleNonScatterer(MATRIX K, Float factor, int scatterer, int Nz, int NBeta);
00156 
00157 void addToDiagonal(MATRIX *m, Float epsilon);
00158 
00159 Float calcCondNum(MATRIX ak);
00160 
00164 VECTOR readText(char *filename);
00165 
00166 void print_matrix( char* desc, int m, int n, Float* a, int lda, MatrixOrder order);
00167 void print_matrix2(char* desc, MATRIX m, MatrixOrder order);
00168 void print_matrixNoI(char* desc, MATRIX m, MatrixOrder order);
00169 void print_matrixML(char* desc, MATRIX m, MatrixOrder order);
00170 void print_matrix2toFile(char* desc, MATRIX m, MatrixOrder order);
00171 
00172 
00173 int testTranspose();
00174 
00175 #endif