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