二次型矩阵相乘可逆矩阵C++实现
时间: 2023-07-11 07:14:51 浏览: 52
以下是C++代码实现二次型矩阵相乘可逆矩阵:
```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=105;
const double eps=1e-8;
int n;
double a[MAXN][MAXN],b[MAXN][MAXN],c[MAXN][MAXN],d[MAXN][MAXN];
int gauss(){
int r,c;
for(r=1,c=1;r<=n&&c<=n;r++,c++){
int p=r;
for(int i=r+1;i<=n;i++){
if(fabs(a[i][c])>fabs(a[p][c])){
p=i;
}
}
if(fabs(a[p][c])<=eps){
r--;
continue;
}
if(p!=r){
for(int i=c;i<=n+1;i++){
swap(a[p][i],a[r][i]);
}
}
for(int i=r+1;i<=n;i++){
double f=a[i][c]/a[r][c];
for(int j=c;j<=n+1;j++){
a[i][j]-=f*a[r][j];
}
}
}
for(int i=r;i<=n;i++){
if(fabs(a[i][n+1])>eps){//无解
return -1;
}
}
if(r<n){//无穷解
return n-r+1;
}
for(int i=n;i>=1;i--){
for(int j=i+1;j<=n;j++){
a[i][n+1]-=a[i][j]*a[j][n+1];
}
a[i][n+1]/=a[i][i];
for(int j=i-1;j>=1;j--){
a[j][n+1]-=a[j][i]*a[i][n+1];
}
}
return 0;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%lf",&a[i][j]);
b[i][j]=a[i][j];
}
}
for(int i=1;i<=n;i++){
scanf("%lf",&c[i][1]);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][1]+=b[i][j]*c[j][1];
}
}
for(int k=1;k<=n;k++){//枚举第k列
for(int i=1;i<=n;i++){//枚举第i行
for(int j=1;j<=n;j++){//枚举第j列
a[i][j]=b[i][j];
}
a[i][n+1]=d[i][1];
if(k==i){
a[i][k]=1;
}
}
gauss();
for(int i=1;i<=n;i++){
if(fabs(a[i][n+1])<=eps){
printf("0.00000 ");
}
else{
printf("%.5lf ",a[i][n+1]);
}
}
printf("\n");
}
return 0;
}
```
这段代码实现了输入一个 $n \times n$ 的矩阵 $A$ 和一个 $n \times 1$ 的矩阵 $x$,求 $Ax$ 的结果。其中的 gauss() 函数实现了高斯消元法求解线性方程组。