线性代数运算
2016-07-10 01:33
253 查看
#include<iostream> #include<cstdlib> using namespace std; class matrix { private: int fun1(int **a,int n) { int t=0; if(n==1) return a[0][0]; if(n==2) return a[0][0]*a[1][1]-a[1][0]*a[0][1]; for(int y=0; y<n; y++) t+=fun2(a,n,0,y,1); return t; } int fun2(int **a,int n,int x,int y,int r) { int t=0; int **b=new int *[n-1]; for(int i=0; i<n-1; i++) { b[i]=new int[n-1]; for(int j=0; j<n-1; j++) { if(i<x&&j<y) b[i][j]=a[i][j]; else if(i<x&&j>=y) b[i][j]=a[i][j+1]; else if(i>=x&&j<y) b[i][j]=a[i+1][j]; else if(i>=x&&j>=y) b[i][j]=a[i+1][j+1]; } } int s=1; if((x+y)%2) s=-1; if(r==0) t+=s*fun1(b,n-1); else t+=s*a[x][y]*fun1(b,n-1); delete[] b; return t; } void fun3(int **a,int m,int n,double **b) { for(int i=0; i<n; i++) for(int j=0; j<m; j++) b[i][j]=a[j][i]; } public: void determinant_calculation()//行列式计算 { int n;cin>>n; int **a=new int * ; for(int i=0; i<n; i++) { a[i]=new int ; for(int j=0; j<n; j++) cin>>a[i][j]; } cout<<fun1(a,n)<<endl; delete[] a; } void mul()//矩阵乘法 { int m1,n1,m2,n2; cin>>m1>>n1; int a[m1][n1]= {0}; for(int i=0; i<m1; i++) for(int j=0; j<n1; j++) cin>>a[i][j]; cin>>m2>>n2; int b[m2][n2]= {0}; for(int i=0; i<m2; i++) for(int j=0; j<n2; j++) cin>>b[i][j]; int c[m1][n2]= {0}; for(int i=0; i<m1; i++) { for(int j=0; j<n2; j++) { for(int k=0; k<n1; k++) c[i][j]+=a[i][k]*b[k][j]; cout<<c[i][j]<<" "; } cout<<endl; } } void transpose()//转置 { int m,n;cin>>m>>n; int **a=new int *[m]; for(int i=0; i<m; i++) { a[i]=new int ; for(int j=0; j<n; j++) cin>>a[i][j]; } double **b=new double * ; for(int i=0; i<n; i++) b[i]=new double[m]; fun3(a,m,n,b); for(int i=0; i<n; i++) { for(int j=0; j<m; j++) cout<<b[i][j]<<" "; cout<<endl; } } void accompany()//伴随 { int m;cin>>m; int **a=new int *[m]; for(int i=0; i<m; i++) { a[i]=new int[m]; for(int j=0; j<m; j++) cin>>a[i][j]; } int **b=new int *[m]; for(int i=0; i<m; i++) b[i]=new int[m]; for(int i=0; i<m; i++) for(int j=0; j<m; j++) b[i][j]=fun2(a,m,i,j,0); double **c=new double *[m]; for(int i=0; i<m; i++) c[i]=new double[m]; fun3(b,m,m,c); for(int i=0; i<m; i++) { for(int j=0; j<m; j++) cout<<c[i][j]<<" "; cout<<endl; } delete[] a; } void inverse()//逆矩阵 { int m;cin>>m; int **a=new int *[m]; for(int i=0; i<m; i++) { a[i]=new int[m]; for(int j=0; j<m; j++) cin>>a[i][j]; } if(fun1(a,m)) { int **b=new int *[m]; for(int i=0; i<m; i++) b[i]=new int[m]; for(int i=0; i<m; i++) for(int j=0; j<m; j++) b[i][j]=fun2(a,m,i,j,0); double **c=new double *[m]; for(int i=0; i<m; i++) c[i]=new double[m]; fun3(b,m,m,c); double q=1.0/fun1(a,m); for(int i=0; i<m; i++) { for(int j=0; j<m; j++) cout<<q*c[i][j]<<" "; cout<<endl; } delete[] b; delete[] c; } else cout<<"行列式为0,逆矩阵不存在"<<endl; delete[] a; } }matrix; int main() { int t; while(cin>>t) { if(t==1)matrix.determinant_calculation(); else if(t==2)matrix.mul(); else if(t==3)matrix.transpose(); else if(t==4)matrix.accompany(); else if(t==5)matrix.inverse(); } return 0; }
相关文章推荐
- Java静态域与静态方法
- 多项式求根
- centOs安装jdk1.7
- 防止僵尸进程的fork编程
- cocos2dx 实习生培训计划
- C++中的friend友元函数详细解析
- Qt中使用WMI时遇到的那些坑儿
- Qt中使用WMI时遇到的那些坑儿
- 一分钟上手artTemplate
- Factory Pattern(工厂模式)
- Java集合类库 ArrayList 源码解析
- 【MyBatis框架】Mybatis开发dao方法第二部分
- iOS 【Multithreading-栅栏函数/快速迭代(剪切图片)/队列组(图片水印)】
- HashMap深度解析(一)
- java中的异常类型与处理方法
- java中HashMap详解
- Java线程池的使用
- Android 抽屉效果的导航菜单实现
- javascript 自定义弹窗 自定义参数 过渡
- HashMap Hashtable区别