#include <iostream> #include <cstdio> #include <iomanip> using namespace std; #define N 50 //得到给定矩阵src的逆矩阵保存到des中。 double getA(double arcs[N][N],int n); //计算每一行每一列的每个元素所对应的余子式,组成A* void getAStart(double arcs[N][N],int n,double ans[N][N]) { if(n==1) { ans[0][0] = 1; return; } int i,j,k,t; double temp[N][N]; for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(k=0;k<n-1;k++) { for(t=0;t<n-1;t++) { temp[k][t] = arcs[k>=i?k+1:k][t>=j?t+1:t]; } } ans[j][i] = getA(temp,n-1); if((i+j)%2 == 1) { ans[j][i] = - ans[j][i]; } } } } bool GetMatrixInverse(double src[N][N],int n,double des[N][N]) { double flag=getA(src,n); double t[N][N]; if(flag==0) { return false; } else { getAStart(src,n,t); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { des[i][j]=t[i][j]/flag; } } } return true; } //按第一行展开计算|A| double getA(double arcs[N][N],int n) { if(n==1) { return arcs[0][0]; } double ans = 0; double temp[N][N]={0.0}; int i,j,k; for(i=0;i<n;i++) { for(j=0;j<n-1;j++) { for(k=0;k<n-1;k++) { temp[j][k] = arcs[j+1][(k>=i)?k+1:k]; } } double t = getA(temp,n-1); if(i%2==0) { ans += arcs[0][i]*t; } else { ans -= arcs[0][i]*t; } } return ans; } int main(){ double a[N][N]; double b[N][N]; double c[N][N]; double d[N][N]; int n,m,q; int i,j,k,kk=0; cout<<"陈扬送给给位没有matlab又深陷线性代数的道友^-^"<<endl; cout<<"求X=B/A的程序,利用克拉默法则:"<<endl; cout<<"输入行列式a的大小m,n:"<<endl; cin>>m>>n; for(i=0;i<n;i++) for(j=0;j<n;j++) cin>>d[i][j]; GetMatrixInverse(d, n, a); cout<<"输入矩阵b的大小n,q:"<<endl; cin>>n>>q; for(i=0;i<n;i++) for(j=0;j<q;j++) cin>>b[i][j]; for(i=0;i<m;i++) for(j=0;j<q;j++) { c[i][j]=0; for(k=0;k<n;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; } cout<<"矩阵c为矩阵b/a的乘积, 相当于c为克拉默法则运算后的X的解的矩阵"<<endl; for(i=0;i<m;i++) for(j=0;j<q;j++) { cout<<setw(7)<<c[i][j]; kk=kk+1; if(kk%q==0) cout<<endl; } double ans=getA(d,n); cout<<"|A|="<<ans; return 0; }
run:
陈扬送给给位没有matlab又深陷线性代数的道友^-^
求X=B/A的程序,利用克拉默法则:
输入行列式a的大小m,n:
5 5
0 1 1 1 1
1 0 1 1 1
1 1 0 1 1
1 1 1 0 1
1 1 1 1 0
输入矩阵b的大小n,q:
5 1
1 2 3 4 5
矩阵c为矩阵b/a的乘积, 相当于c为克拉默法则运算后的X的解的矩阵
2.75
1.75
0.75
-0.25
-1.25
|A|=4