00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _LINALG_H_
00010 #define _LINALG_H_
00011
00012 #include "debug.h"
00013
00014 class matrix {
00015 protected:
00016 int rows;
00017 int columns;
00018 double **A;
00019 public:
00020 matrix(int r = 1, int c = 1)
00021 {
00022 int i,j;
00023 rows=r; columns=c;
00024 A = new double*[rows];
00025 for (i=0;i<=rows-1;i++)
00026 A[i] = new double[columns];
00027 for (i=0;i<=rows-1;i++)
00028 {
00029 for(j=0;j<=columns-1;j++)
00030 A[i][j]=0;
00031 }
00032 }
00033 matrix(const matrix &B)
00034 {
00035 int i,j;
00036 rows = B.rows;
00037 columns = B.columns;
00038 A = new double*[rows];
00039 for (i=0;i<=rows-1;i++)
00040 A[i] = new double[columns];
00041 for (i=0;i<=rows-1;i++)
00042 {
00043 for(j=0;j<=columns-1;j++)
00044 A[i][j]=B.A[i][j];
00045 }
00046 }
00047 ~matrix()
00048 {
00049 long i;
00050 for (i=0; i<=rows-1; i++)
00051 delete [] A[i];
00052 delete [] A;
00053 }
00054 matrix &operator=(const matrix &B)
00055 {
00056 long i,j;
00057 for (i=0; i<=rows-1; i++)
00058 delete [] A[i];
00059 delete [] A;
00060 rows = B.rows;
00061 columns = B.columns;
00062 A = new double*[rows];
00063 for (i=0;i<=rows-1;i++)
00064 A[i] = new double[columns];
00065 for (i=0;i<=rows-1;i++)
00066 {
00067 for(j=0;j<=columns-1;j++)
00068 A[i][j] = B.A[i][j];
00069 }
00070 return *this;
00071 }
00072 long *size() {long *dim = new long[2]; dim[0] = rows; dim[1]=columns; return(dim);}
00073 long row() const {return(rows);}
00074 long column() const {return(columns);}
00075 void newsize(long r, long c = 1)
00076 {
00077 long i,j;
00078 for (i=0; i<=rows-1; i++)
00079 delete [] A[i];
00080 delete [] A;
00081 rows = r; columns = c;
00082 A = new double*[rows];
00083 for (i=0;i<=rows-1;i++)
00084 A[i] = new double[columns];
00085 for (i=0;i<=rows-1;i++)
00086 {
00087 for(j=0;j<=columns-1;j++)
00088 A[i][j]=0;
00089 }
00090 }
00091 double get(long i, long j = 0) const {return(A[i][j]);}
00092 void set(double x, long i, long j=0) {A[i][j]=x;}
00093 void add(double x, long i, long j=0) {A[i][j] += x;};
00094 void sub(double x, long i, long j=0) {A[i][j] -= x;};
00095 void mul(double x, long i, long j=0) {A[i][j] *= x;};
00096
00097
00098
00099
00100
00101
00102
00103 matrix map(double(*f)(double));
00104 matrix getrow(long i) const;
00105 matrix getcolumn(long i) const;
00106 matrix addcolumns();
00107 void setrow(const matrix &B, long i);
00108 void setcolumn(const matrix &B, long i);
00109 long operator==(const matrix &B);
00110 matrix operator*(const double &x);
00111 matrix operator*(const matrix &B);
00112 matrix trans();
00113 matrix operator+(const matrix &B);
00114 matrix operator-(const matrix &B);
00115 matrix inv();
00116 double twonorm();
00117 double onenorm();
00118
00119
00120
00121
00122
00123
00124 safevector<double> mean() const;
00125
00126
00127
00128
00129
00130
00131 safevector<double> var() const;
00132
00133
00134
00135
00136
00137
00138
00139
00140 matrix covar() const;
00141
00142 double maxvalue();
00143 const char* row2string(int r);
00144 void print() const;
00145 void stdprint() const;
00146 void swap(long i, long j)
00147 { double *tmp = A[i];
00148 A[i]=A[j];
00149 A[j] = tmp;
00150 }
00151 void swapc(long i, long j)
00152 {
00153 double tmp;
00154 long k;
00155 for(k=0;k<=rows-1;k++)
00156 { tmp=A[k][i];
00157 A[k][i]= A[k][j];
00158 A[k][j]=tmp;
00159 }
00160 }
00161 };
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 matrix covar2(matrix const& X, matrix const& Y);
00176
00177
00178
00179 #endif // _LINALG_H_