您的位置:首页 > 其它

线性代数运算

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: