00001 # include "Matrix2D.hpp"
00002
00003
00004
00005 Matrix2D::Matrix2D() {
00006 size[0]=size[1]=0 ;
00007 a=NULL ;
00008 }
00009
00010 Matrix2D::Matrix2D(const int s0,const int s1) {
00011 Init(s0,s1) ;
00012 }
00013
00014 void Matrix2D::Init(const int s0,const int s1) {
00015 size[0]=s0;size[1]=s1 ;
00016 if (s0*s1<=0) return ;
00017 a=(double **)malloc(sizeof(double *)*s0); assert(a);
00018 for (int i=0; i<s0; i++) { a[i]=(double *)calloc(s1,sizeof(double)); assert(a[i]) ; }
00019 }
00020
00021 Matrix2D::~Matrix2D()
00022 {
00023 if (a) for (int i=0; i<size[0]; i++) free(a[i]) ;
00024 free(a) ;
00025 a=NULL ;
00026 size[0]=size[1]=0 ;
00027 }
00028
00029 void Matrix2D::Print() const
00030 {
00031 std::cout <<"size: "<<size[0]<<' '<<size[1]<<' '<<a<<'\n' ;
00032 for (int i=0; i<size[0]; i++) {
00033 for (int j=0; j<size[1]; j++) std::cout <<a[i][j]<<' ' ;
00034 std::cout << '\n' ;
00035 }
00036 }
00037
00038 void Matrix2D::Copy(Matrix2D *B)
00039 {
00040 assert(a==NULL) ;
00041 Init(B->size[0],B->size[1]) ;
00042
00043 for (int i=0; i<size[0]; i++)
00044 for (int j=0; j<size[1]; j++) a[i][j]=B->a[i][j] ;
00045 }
00046
00047 void Matrix2D::Mirror(Matrix2D *B)
00048 {
00049 assert(a==NULL) ;
00050 Init(B->size[0],B->size[1]) ;
00051
00052 for (int i=0; i<size[0]; i++)
00053 for (int j=0; j<size[1]; j++) a[size[0]-1-i][size[1]-1-j]=B->a[i][j] ;
00054 }
00055
00056
00057 void Matrix2D::Read(FILE *fid)
00058 {
00059 fscanf(fid,"%d %d",&size[0],&size[1]) ;
00060 if (size[0]*size[1]<=0) {
00061 size[0]=size[1]=0 ;
00062 }
00063 Init(size[0],size[1]) ;
00064
00065 for (int i=0;i<size[0];i++)
00066 for (int j=0;j<size[1];j++) fscanf(fid,"%le",&a[i][j]) ;
00067 }
00068
00069
00070
00071
00072
00073 void Matrix2D::MatVec(double *const V,double *const W) const
00074 {
00075 double s,t[100] ;
00076 int i ;
00077
00078 assert(size[1]<100) ;
00079 for (i=0;i<size[1];i++) t[i]=V[i] ;
00080
00081 for (i=0;i<size[0];i++)
00082 {s=0; for (int j=0;j<size[1];j++) s+=a[i][j]*t[j] ; W[i]=s ;}
00083 }
00084
00085
00086 void Matrix2D::MatTVec(double *const V,double *const W) const
00087 {
00088 double s,t[100] ;
00089 int i ;
00090
00091 assert(size[1]<100) ;
00092 for (i=0;i<size[0];i++) t[i]=V[i] ;
00093
00094 for (i=0;i<size[1];i++)
00095 {s=0; for (int j=0;j<size[0];j++) s+=a[j][i]*t[j] ; W[i]=s ;}
00096 }
00097
00098 void Matrix2D::APlusBMatVec(const double al,const double bl,double *const V,double *const W) const
00099 {
00100 double s,t[100] ;
00101 int i ;
00102
00103 assert(size[1]<100) ;
00104 for (i=0;i<size[1];i++) t[i]=V[i] ;
00105
00106 for (i=0;i<size[0];i++)
00107 {s=0.0; for (int j=0;j<size[1];j++) s+=a[i][j]*t[j] ; W[i] =al*W[i]+bl*s ;}
00108 }
00109
00110 void Matrix2D::APlusBMatTVec(const double al,const double bl,double *const V,double *const W) const
00111 {
00112 double s,t[100] ;
00113 int i ;
00114
00115 assert(size[1]<100) ;
00116 for (i=0;i<size[0];i++) t[i]=V[i] ;
00117
00118 for (i=0;i<size[1];i++)
00119 {s=0.0; for (int j=0;j<size[0];j++) s+=a[j][i]*t[j] ; W[i] =al*W[i]+bl*s ;}
00120 }
00121
00122 void Matrix2D::AdaptiveAPlusBMatVec(const double al,const double bl,double *const V,double *const W,int j0,int j1) const
00123 {
00124 double s,t[100] ;
00125 int i,j ;
00126
00127 assert(size[1]<100) ;
00128 for (i=0;i<size[1];i++) t[i]=V[i] ;
00129
00130 for(i=0;i<size[0];i++) W[i]*=al ;
00131
00132 for (j=j0;j<=min(j1,size[1]-1);j++) {
00133 s=t[j]*bl ;
00134 for (i=0;i<size[0];i++) W[i] += a[i][j]*s ;
00135 }
00136 }
00137
00138 void Matrix2D::AdaptiveAPlusBMatTVec(const double al,const double bl,double *const V,double *const W,int j0,int j1) const
00139 {
00140 double s,t[100] ;
00141 int i,j ;
00142
00143 assert(size[0]<100) ;
00144 for (i=0;i<size[0];i++) t[i]=V[i] ;
00145
00146 for(i=0;i<size[1];i++) W[i]*=al ;
00147
00148 for (j=j0;j<=min(j1,size[0]-1);j++) {
00149 s=t[j]*bl ;
00150 for (i=0;i<size[1];i++) W[i] += a[j][i]*s ;
00151 }
00152 }