void tran_matrix(double *matrix1,double*matrix2,int m,int n)//函数中m代表矩阵的行数,n代表矩阵的烈数
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
matrix2[j*m+i]=matrix1[i*n+j];
}
//矩阵相乘
void mult_matrix(double *matrix1,double*matrix2,double *matrix,int m,int n,int r)
{
for(int i=0;i<m;i++)
for(int j=0;j<r;j++)
{
matrix[i*r+j]=0;
for(int k=0;k<n;k++)
{
matrix[i*r+j]+=matrix1[i*n+k]*matrix2[k*r+j];
}
}
}
//矩阵的求逆
bool inv(double *matrix, int m)
{
double *mat;
int raw=m*2;
int num=raw*m;
mat=new double[num];
//将m*m的矩阵转化成m*2m的矩阵
for(int i=0;i<m;i++)
{
for(int j=0;j<raw;j++)
{
if(j<m)
{
mat[i*raw+j]=matrix[i*m+j];
}
else if (j==m+i) {
mat[i*raw+j]=1;
}
else
{
mat[i*raw+j]=0;
}
}
}
//变换成上三角的矩阵
double k0=0;
for(i=0;i<m-1; i++)
{
//cout<<mat[i*raw+i]<<endl;
if(mat[i*raw+i]!=1)
{
for (int j=raw-1;j>i-1;j--)
{
mat[i*raw+j]/=mat[i*raw+i];
}
}
for (int j=i+1;j<m;j++)
{
for(int k=raw-1;k>i-1;k--)
{
mat[j*raw+k]-=mat[i*raw+k]*mat[j*raw+i];
}
}
}
//将对角线上的元素全化成1
for(i=0;i<m;i++)
{
if (mat[i*raw+i]!=1&&mat[i*raw+i]!=0)
{
for (int j=raw-1;j>i-1;j--)
{
mat[i*raw+j]/=mat[i*raw+i];
}
}
}
//化简成下三角
for(i=m-1;i>0;i--)
{
for(int j=i-1;j>-1;j--)
{
for (int k=raw-1;k>i-1;k--)
{
mat[j*raw+k]-=mat[i*raw+k]*mat[j*raw+i];
}
}
}
for(i=0;i<m;i++)
{
for(int k=raw-1;k>m-1;k--)
{
matrix[i*m+k-m]=mat[i*raw+k];
}
}
for(i=0;i<m;i++)
{
if (mat[i*raw+i]!=1&&mat[i*raw+i]!=0)
{
for (int j=raw-1;j>i-1;j--)
{
mat[i*raw+j]/=mat[i*raw+i];
}
}
else if(mat[i*raw+i]==0)
{
return false;
break;
}
}
return true;
}