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