1 #include"iostream" 2 #include"time.h" 3 using namespace std; 4 class matrix{ 5 private: 6 double **a; 7 int list; 8 int line; 9 public: 10 matrix(int line,int list); 11 void creatmatrix(double *a1); //通过一维数组创建矩阵 12 void cinmatrix(); //通过输入创建矩阵 13 void show(); //显示矩阵 14 matrix& operator*(matrix &m); //计算矩阵 15 matrix& operator*(double b); 16 matrix& operator+(matrix &m); 17 matrix& operator-(matrix &m); 18 double determinant(); //计算方阵的行列式 19 matrix& adjoint(); //伴随矩阵 20 matrix& inverse(); //逆矩阵 21 void info(){ 22 if(line != list){ 23 return; 24 } 25 cout<<"方阵的行列式:"<<determinant()<<endl; 26 cout<<"伴随矩阵: "; 27 adjoint().show(); 28 cout<<"逆矩阵: "; 29 inverse().show(); 30 } 31 }; 32 //3 3 1 2 1 2 1 0 1 0 1 33 //3 3 2 1 1 1 4 -4 1 0 2 34 //4 4 1 1 1 1 2 4 3 1 4 16 9 1 8 64 27 1 35 int main(){ 36 void randtest(); 37 void cinmatrix(int n = 1); 38 randtest(); //随机生成矩阵 39 //cinmatrix(); //输入矩阵:行数 列数 所有值 40 return 0; 41 } 42 void randtest(){ 43 const int n = 120; 44 matrix m1(3,3),m2(3,3); 45 double a[n]; 46 srand(time(NULL)); 47 for(int i = 0;i < n;i++){ 48 a[i] = rand()%6; 49 } 50 m1.creatmatrix(a); 51 m2.creatmatrix(a); 52 m1.show(); 53 m1.info(); 54 //m2.show(); 55 //(m1 * m2).show(); 56 } 57 void cinmatrix(int n){ 58 int line,list; 59 cout<<"输入矩阵的行,列和各个值,空格隔开"<<endl; 60 cin>>line>>list; 61 matrix m1(line,list); 62 matrix *m2; 63 m1.cinmatrix(); 64 if(n == 2){ 65 cin>>line>>list; 66 m2 = new matrix(line,list); 67 m2->cinmatrix(); 68 } 69 m1.show(); 70 m1.info(); 71 if(n == 2){ 72 m2->show(); 73 (m1 * *m2).show(); 74 } 75 } 76 matrix::matrix(int line,int list){ 77 this->list = list; 78 this->line = line; 79 a = new double*[line]; 80 for(int i = 0;i < line;i++){ 81 a[i] = new double[list]; 82 } 83 } 84 85 void matrix::creatmatrix(double *a1){ 86 for(int i = 0;i < line;i++){ 87 for(int j = 0;j < list;j++){ 88 a[i][j] = a1[i * list + j]; 89 } 90 } 91 } 92 void matrix::cinmatrix(){ 93 for(int i = 0;i < line;i++){ 94 for(int j = 0;j < list;j++){ 95 cin>>a[i][j]; 96 } 97 } 98 } 99 void matrix::show(){ 100 cout.precision(3); 101 for(int i = 0;i < line;i++){ 102 cout<<"| "; 103 for(int j = 0;j < list;j++){ 104 cout<<a[i][j]<<" "; 105 } 106 cout<<"|"<<endl; 107 } 108 cout<<endl; 109 } 110 111 matrix& matrix::operator+(matrix &m){ 112 matrix *m1 = new matrix(this->line,m.list); 113 if(list != m.list||line != m.line){ 114 cout<<"error"<<endl; 115 return *m1; 116 } 117 for(int i = 0;i < line;i++){ 118 for(int j = 0;j < m.list;j++){ 119 m1->a[i][j] = a[i][j] + m.a[i][j]; 120 } 121 } 122 return *m1; 123 } 124 125 matrix& matrix::operator-(matrix &m){ 126 matrix *m1 = new matrix(this->line,m.list); 127 if(list != m.list||line != m.line){ 128 cout<<"error"<<endl; 129 return *m1; 130 } 131 for(int i = 0;i < line;i++){ 132 for(int j = 0;j < m.list;j++){ 133 m1->a[i][j] = a[i][j] - m.a[i][j]; 134 } 135 } 136 return *m1; 137 } 138 139 matrix& matrix::operator*(matrix &m){ 140 matrix *m1 = new matrix(this->line,m.list); 141 if(list != m.line){ 142 cout<<"error"<<endl; 143 return *m1; 144 } 145 for(int i = 0;i < line;i++){ 146 for(int j = 0;j < m.list;j++){ 147 double sum = 0; 148 for(int w = 0,h = 0;w < this->list;w++,h++){ 149 sum += this->a[i][w] * m.a[h][j]; 150 } 151 m1->a[i][j] = sum; 152 } 153 } 154 return *m1; 155 } 156 157 matrix& matrix::operator *(double b){ 158 matrix *m1 = new matrix(line,list); 159 for(int i = 0;i < line;i++){ 160 for(int j = 0;j < list;j++){ 161 m1->a[i][j] = a[i][j] * b; 162 } 163 } 164 return *m1; 165 } 166 167 double matrix::determinant(){ 168 if(list!=line){ 169 cout<<"error"<<endl; 170 return 0; 171 } 172 if(list==1){ 173 return a[0][0]; 174 } 175 else{ 176 double result = 0; 177 matrix b(line - 1,list - 1); 178 for(int j = 0;j < list;j++){ 179 int i2 = 0,j2 = 0; 180 for(int i1 = 1;i1 < line;i1++){ 181 for(int j1 = 0;j1 < list;j1++){ 182 if(j1 != j){ //划去第一行第j1列,创建一个新矩阵 183 b.a[i2][j2++] = a[i1][j1]; 184 if(j2 == b.list){ 185 j2 = 0; 186 i2++; 187 } 188 } 189 } 190 } 191 if(j%2==0){ 192 result += a[0][j] * b.determinant(); 193 } 194 else{ 195 result -= a[0][j] * b.determinant(); 196 } 197 } 198 return result; 199 } 200 } 201 matrix& matrix::adjoint(){ //伴随矩阵 202 matrix *m = new matrix(line,list); 203 matrix m1(line - 1,list - 1); 204 if(line != list){ 205 cerr<<"out of space!"<<endl; 206 return *m; 207 } 208 for(int i = 0;i < line;i++){ 209 for(int j = 0;j < list;j++){ 210 int i2 = 0,j2 = 0; 211 for(int i1 = 0;i1 < line;i1++){ 212 for(int j1 = 0;j1 < list;j1++){ 213 if(i1 != i && j1 != j){ 214 m1.a[i2][j2++] = a[i1][j1]; 215 if(j2 == m1.list){ 216 i2++; 217 j2 = 0; 218 } 219 } 220 } 221 } 222 if((j + i) % 2 == 0){ 223 m->a[j][i] = m1.determinant(); 224 } 225 else{ 226 m->a[j][i] = -1 * m1.determinant(); 227 } 228 } 229 } 230 return *m; 231 } 232 233 matrix& matrix::inverse(){ 234 matrix m = this->adjoint(); 235 return m * (1 / this->determinant()); 236 }