很久没有写过C语言,今天写了一个关于矩阵的算法
完整代码如下:
#include<atlstr.h>
#include<iostream>
#include<string>
using namespace std;
//创建矩阵
float **Creat(int n)
{
float **array=new float*[n];
for(int i=0;i<n;i++)
{
array[i]=new float[n];
}
printf("请输入矩阵:\n");
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>array[i][j];
}
}
return array;
}
//求行列式的值:
float Value(float **array,int n)
{
float Result=0;
if(n==1) return array[0][0];
float **temp=new float*[n-1];
for(int i=0;i<n-1;i++)
{
temp[i]=new float[n-1];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1;j++)
{
for(int k=0;k<n-1;k++)
{
int flag;
if(j<i) flag=0;
else flag=1;
temp[j][k]=array[j+flag][k+1];
}
}
int flag2=-1;
if(i%2==0) flag2=1;
Result+=flag2*array[i][0]*Value(temp,n-1);
}
return Result;
}
//求逆矩阵: 伴随矩阵行列式的值除以行列式的值
float **GetMarin(float **array,int n)
{
float **resultMarin=array;
float resultSum=Value(array,n);
float **temp=new float*[n-1];
for(int i=0;i<n-1;i++)
{
temp[i]=new float[n-1];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n-1;k++)
{
for(int m=0;m<n-1;m++)
{
int flag1=0;
int flag2=0;
if(k<i) flag1=0;
else flag1=1;
if(m<j) flag2=0;
else flag2=1;
temp[k][m]=array[k+flag1][m+flag2];
}
}
int flag3=-1;
if((i+j)%2==0) flag3=1;
resultMarin[j][i]=(float)flag3*Value(temp,n-1)/resultSum;
}
}
return resultMarin;
}
//矩阵加减
float **GetAdd(float **array1,float **array2,int rowCount,int columCount,float v)
{
float **result=new float*[rowCount];
for(int i=0;i<rowCount;i++)
{
result[i]=new float[columCount];
}
for(int i=0;i<rowCount;i++)
{
for(int j=0;j<columCount;j++)
{
result[i][j]=array1[i][j]+v*array2[i][j];
}
}
return result;
}
//倍法矩阵
float **Matrixk(float **arry,int rowCount,int columCount,int k)
{
float **result=new float*[rowCount];
for(int i=0;i<rowCount;i++)
{
result[i]=new float[columCount];
}
for(int i=0;i<rowCount;i++)
{
for(int j=0;j<columCount;j++)
{
result[i][j]=k*(arry[i][j]);
}
}
return result;
}
//矩阵数乘
float **MatrixCheng(float **arry1,float **arry2,int rowCount1,int columCount1,int rowCount2,int columCount2)
{
if(columCount1!=rowCount2)
{
return NULL;
}
float **result=new float*[rowCount1];
for(int i=0;i<rowCount1;i++)
{
result[i]=new float[columCount2];
}
//数乘运算
for(int i=0;i<rowCount1;i++)
{
for(int j=0;j<columCount2;j++)
{
float temp=0;
for(int k=0;k<columCount1;k++)
{
temp+=arry1[i][k]*arry2[k][j];
}
result[i][j]=temp;
}
}
return result;
}
/***********下面进行测试,为了方便,全部采用的方阵**********/
void OutPut(float **array,int n)
{
printf("运算结果:\n");
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%f ",array[i][j]);
}
printf("\n");
}
}
void test()
{
printf("请输入你想进行的运算:\n1.求行列式值\n2.求逆矩阵\n3.矩阵加减运算\n4.矩阵数乘运算\n");
int choise=0;
cin>>choise;
if(choise==1)
{
printf("请输入你想输入矩阵的阶数:");
int n;
cin>>n;
float **array=Creat(n);
float Result=Value(array,n);
printf("行列式的值=%f\n",Result);
}
else if(choise==2)
{
printf("请输入你想输入矩阵的阶数:");
int n;
cin>>n;
float **array=Creat(n);
float Result=Value(array,n);
if(Result==0)
{
printf("该矩阵没有逆矩阵\n");
}
else
{
float **resultMarin=GetMarin(array,n);
OutPut(resultMarin,n);
}
}
else if(choise==3)
{
printf("请输入你想输入矩阵1的阶数:");
int n1;
cin>>n1;
float **array1=Creat(n1);
printf("请输入你想输入矩阵2的阶数:");
int n2;
cin>>n2;
float **array2=Creat(n2);
printf("请输入运算系数:");
float opreation=0;
cin>>opreation;
float **resultMarin=GetAdd(array1,array2,n1,n1,opreation);
OutPut(resultMarin,n1);
}
else if(choise==4)
{
printf("请输入你想输入矩阵1的阶数:");
int n1;
cin>>n1;
float **array1=Creat(n1);
printf("请输入你想输入矩阵2的阶数:");
int n2;
cin>>n2;
float **array2=Creat(n2);
float **resultMarin=MatrixCheng(array1,array2,n1,n1,n2,n2);
OutPut(resultMarin,n1);
}
else
{
printf("------------");
}
test();
}
void main()
{
test();
}
#include<atlstr.h>#include<iostream>#include<string>using namespace std;//创建矩阵float **Creat(int n){ float **array=new float*[n]; for(int i=0;i<n;i++) { array[i]=new float[n]; } printf("请输入矩阵:\n"); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>array[i][j]; } } return array;}//求行列式的值:float Value(float **array,int n){ float Result=0; if(n==1) return array[0][0]; float **temp=new float*[n-1]; for(int i=0;i<n-1;i++) { temp[i]=new float[n-1]; } for(int i=0;i<n;i++) { for(int j=0;j<n-1;j++) { for(int k=0;k<n-1;k++) { int flag; if(j<i) flag=0; else flag=1; temp[j][k]=array[j+flag][k+1]; } } int flag2=-1; if(i%2==0) flag2=1; Result+=flag2*array[i][0]*Value(temp,n-1); } return Result;}//求逆矩阵: 伴随矩阵行列式的值除以行列式的值float **GetMarin(float **array,int n){ float **resultMarin=array; float resultSum=Value(array,n); float **temp=new float*[n-1]; for(int i=0;i<n-1;i++) { temp[i]=new float[n-1]; } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { for(int k=0;k<n-1;k++) { for(int m=0;m<n-1;m++) { int flag1=0; int flag2=0; if(k<i) flag1=0; else flag1=1; if(m<j) flag2=0; else flag2=1; temp[k][m]=array[k+flag1][m+flag2]; } } int flag3=-1; if((i+j)%2==0) flag3=1; resultMarin[j][i]=(float)flag3*Value(temp,n-1)/resultSum; } } return resultMarin;}//矩阵加减float **GetAdd(float **array1,float **array2,int rowCount,int columCount,float v){float **result=new float*[rowCount];for(int i=0;i<rowCount;i++){result[i]=new float[columCount];}for(int i=0;i<rowCount;i++){for(int j=0;j<columCount;j++){ result[i][j]=array1[i][j]+v*array2[i][j];}}return result;}//倍法矩阵float **Matrixk(float **arry,int rowCount,int columCount,int k){float **result=new float*[rowCount];for(int i=0;i<rowCount;i++){result[i]=new float[columCount];}for(int i=0;i<rowCount;i++){for(int j=0;j<columCount;j++){ result[i][j]=k*(arry[i][j]);}}return result;}//矩阵数乘float **MatrixCheng(float **arry1,float **arry2,int rowCount1,int columCount1,int rowCount2,int columCount2){if(columCount1!=rowCount2){return NULL;}float **result=new float*[rowCount1];for(int i=0;i<rowCount1;i++){result[i]=new float[columCount2];}//数乘运算for(int i=0;i<rowCount1;i++){for(int j=0;j<columCount2;j++){float temp=0;for(int k=0;k<columCount1;k++){temp+=arry1[i][k]*arry2[k][j];}result[i][j]=temp;}}return result;}/***********下面进行测试,为了方便,全部采用的方阵**********/void OutPut(float **array,int n){ printf("运算结果:\n"); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { printf("%f ",array[i][j]); } printf("\n"); }}void test(){printf("请输入你想进行的运算:\n1.求行列式值\n2.求逆矩阵\n3.矩阵加减运算\n4.矩阵数乘运算\n");int choise=0;cin>>choise;if(choise==1){ printf("请输入你想输入矩阵的阶数:");int n; cin>>n; float **array=Creat(n); float Result=Value(array,n); printf("行列式的值=%f\n",Result);}else if(choise==2){ printf("请输入你想输入矩阵的阶数:");int n; cin>>n; float **array=Creat(n); float Result=Value(array,n); if(Result==0) {printf("该矩阵没有逆矩阵\n"); }else{ float **resultMarin=GetMarin(array,n); OutPut(resultMarin,n);}}else if(choise==3){ printf("请输入你想输入矩阵1的阶数:");int n1; cin>>n1; float **array1=Creat(n1); printf("请输入你想输入矩阵2的阶数:");int n2; cin>>n2; float **array2=Creat(n2); printf("请输入运算系数:"); float opreation=0; cin>>opreation; float **resultMarin=GetAdd(array1,array2,n1,n1,opreation); OutPut(resultMarin,n1);}else if(choise==4){ printf("请输入你想输入矩阵1的阶数:");int n1; cin>>n1; float **array1=Creat(n1); printf("请输入你想输入矩阵2的阶数:");int n2; cin>>n2; float **array2=Creat(n2); float **resultMarin=MatrixCheng(array1,array2,n1,n1,n2,n2); OutPut(resultMarin,n1);}else{printf("------------");} test();}void main(){ test();}
来源:https://www.cnblogs.com/Huaran1chendu/p/4841607.html