1、矩陣的加減乘除求逆運算的概念:
(1)矩陣概念
有m n個數排列成一個m行n 列,並括以方括弧(或圓括弧)的數表稱為m行n 列矩陣。
(2)矩陣加法:
(3)矩陣乘法:
(4)矩陣的求逆運算
(5)矩陣的除法:
分成兩種(1)A\B=inverse(A)*B (2)B/A=B*inverse(A),理解上可能有誤,不過是按照這兩種方式來運算的。。
2、要求:
要求很簡單:編寫一個實現矩陣(向量)的+ - * / 求逆運算的類(女友的一個作業題)
3、實現代碼

1 #include<stdio.h> 2 #include<stdlib.h> 3 #define col 3 4 #define row 3 5 class matrix//類的定義 6 { 7 private: 8 double m[col][row];//矩陣設置為私有的, 9 public: 10 matrix(){}//無參數的構造函數 11 matrix(double a[col][row]);//有參數的構造函數 12 matrix Add(matrix &b);//加法運算聲明 13 matrix Sub(matrix &b);//減法運算聲明 14 matrix Mul(matrix &b);//乘法運算聲明 15 matrix Div(matrix &b);//除法運算聲明 16 matrix Inverse();//求逆運算聲明 17 ~matrix();//析構函數聲明 18 void display();//顯示函數聲明 19 }; 20 matrix::matrix(double a[col][row])//構造函數的定義 21 { 22 int i,j; 23 for(i=0;i<col;i++) 24 for(j=0;j<row;j++) 25 m[i][j]=a[i][j]; 26 } 27 matrix matrix::Add(matrix &b)//加法運算 28 { 29 int i,j; 30 matrix*c=(matrix*)malloc(sizeof(matrix)); 31 for(i=0;i<col;i++) 32 for(j=0;j<row;j++) 33 c->m[i][j]=m[i][j]+b.m[i][j]; 34 return(*c); 35 } 36 matrix matrix::Sub(matrix &b)//減法運算 37 { 38 int i,j; 39 matrix*c=(matrix*)malloc(sizeof(matrix)); 40 for(i=0;i<col;i++) 41 for(j=0;j<row;j++) 42 c->m[i][j]=m[i][j]-b.m[i][j]; 43 return *c; 44 } 45 matrix matrix::Mul(matrix &b)//乘法運算 46 { 47 int i,j,k; 48 double sum=0; 49 matrix*c=(matrix*)malloc(sizeof(matrix)); 50 for(i=0;i<col;i++) 51 { 52 for(j=0;j<row;j++) 53 { 54 for(k=0;k<row;k++) 55 sum+=m[i][k]*(b.m[k][j]); 56 c->m[i][j]=sum; 57 sum=0; 58 } 59 } 60 return(*c); 61 } 62 matrix matrix::Div(matrix &b)//除法運算 63 { 64 //除法直接求解,參見主函數 65 matrix c; 66 return(c); 67 } 68 matrix matrix::Inverse()//求逆運算 69 { //參考博客:http://www.cnblogs.com/rollenholt/articles/2050662.html 70 int i,j,k,M=col,N=2*col; 71 double b[col][col*2]; 72 matrix*c=(matrix*)malloc(sizeof(matrix)); 73 for(i=0;i<M;i++) //賦值 74 for(j=0;j<M;j++) 75 b[i][j]=m[i][j]; 76 for(i=0;i<M;i++) //擴展 77 for(j=M;j<N;j++) 78 { 79 if(i==(j-M)) 80 b[i][j]=1; 81 else 82 b[i][j]=0; 83 } 84 /***************下面進行求逆運算*********/ 85 for(i=0;i<M;i++) 86 { 87 if(b[i][i]==0) 88 { 89 for(k=i;k<M;k++) 90 { 91 if(b[k][i]!=0) //作者的博客里面此處為b[k][k],貌似是不正確的, 92 //因為這對比如說是{0,0,1,1,0,1,0,1,1}的矩陣就會判斷為不可逆, 93 { //而實際上該矩陣是可逆的,這里應該是作者筆誤,待進一步求證 94 for(int j=0;j<N;j++) 95 { 96 double temp; 97 temp=b[i][j]; 98 b[i][j]=b[k][j]; 99 b[k][j]=temp; 100 } 101 break; 102 } 103 } 104 if(k==M) 105 { 106 printf("該矩陣不可逆!\n"); 107 exit(0); 108 } 109 } 110 for(j=N-1;j>=i;j--) 111 b[i][j]/=b[i][i]; 112 113 for(k=0;k<M;k++) 114 { 115 if(k!=i) 116 { 117 double temp=b[k][i]; 118 for(j=0;j<N;j++) 119 b[k][j]-=temp*b[i][j]; 120 } 121 } 122 } 123 /**********************導出結果******************/ 124 for(i=0;i<M;i++) 125 for(j=3;j<N;j++) 126 c->m[i][j-3]=b[i][j]; 127 return (*c); 128 } 129 130 matrix::~matrix() 131 {} 132 void matrix::display() 133 { 134 int i,j; 135 for(i=0;i<col;i++) 136 { 137 for(j=0;j<row;j++) 138 printf("%f ",m[i][j]); 139 printf("\n"); 140 } 141 } 142 void main() 143 { 144 double a[3][3]={{1,0,1},{0,1,1},{0,3,1}}; 145 double b[3][3]={{0,0,1},{1,0,1},{0,1,0}}; 146 matrix ma(a),mb(b),mc; 147 int flag; 148 printf("----------------------------------------------------\n請選擇要進行的操作:\n1、打印\t2、加法"); 149 printf("\t3、減法\n4、乘法\t5、除法\t6、求逆\n7、退出\n"); 150 printf("-----------------------------------------------------\n"); 151 scanf("%d",&flag); 152 while((flag==1)||(flag==2)||(flag==3)||(flag==4)||(flag==5)||(flag==6)||(flag==7)) 153 { 154 if(flag==1) 155 { 156 printf("矩陣a為:\n"); 157 ma.display(); 158 printf("矩陣b為:\n"); 159 mb.display(); 160 } 161 if(flag==2)//矩陣加法運算 162 { 163 printf("矩陣加法運算結果:\n"); 164 mc=ma.Add(mb); 165 mc.display(); 166 } 167 else if(flag==3)//矩陣減法運算 168 { 169 printf("矩陣減法運算結果:\n"); 170 mc=ma.Sub(mb); 171 mc.display(); 172 } 173 else if(flag==4)//矩陣乘法運算 174 { 175 printf("矩陣乘法運算結果:\n"); 176 mc=ma.Mul(mb); 177 mc.display(); 178 } 179 else if(flag==5)//矩陣除法運算 180 { 181 printf("矩陣除法運算結果:\n"); 182 printf("矩陣的除法分成兩類:\n 1、A\\B=inverse(A)*B \n 2、B/A=B*inverse(A)\n"); 183 printf("采用第1類,則a\\b的結果為:\n"); 184 mc=ma.Inverse(); 185 mc=mc.Mul(mb); 186 mc.display(); 187 printf("采用第2類,則a/b的結果為:\n"); 188 mc=mb.Inverse(); 189 mc=ma.Mul(mc); 190 mc.display(); 191 } 192 else if (flag==6)//矩陣求逆運算 193 { 194 printf("矩陣a求逆運算結果為:\n"); 195 mc=ma.Inverse(); 196 mc.display(); 197 198 printf("矩陣b求逆運算結果為:\n"); 199 mc=mb.Inverse(); 200 mc.display(); 201 } 202 else {exit(0);} 203 printf("----------------------------------------------------\n請選擇要進行的操作:\n1、打印\t2、加法"); 204 printf("\t3、減法\n4、乘法\t5、除法\t6、求逆\n7、退出\n"); 205 printf("-----------------------------------------------------\n"); 206 scanf("%d",&flag); 207 } 208 }
4、參考:
(1)c編程,譚浩強
(2)博客:http://www.cnblogs.com/rollenholt/articles/2050662.html