我写了一个C++矩阵类,但是求逆函数不会写了,求大神们帮帮忙!!谢了 5
#include<iostream>
#include<math.h>
using namespace std;
class CZWP_Matrix
{
public:
CZWP_Matrix(int r=0, int c=0);// 构造函数
virtual~CZWP_Matrix(); //析构函数
CZWP_Matrix(const CZWP_Matrix& m);// 复制构造函数
//矩阵运算
void printm() ;//矩阵元素逐个输出
bool operator==(const CZWP_Matrix& m);// 比较运算符
bool operator!=(const CZWP_Matrix& m);// 比较运算符
CZWP_Matrix& operator=(const CZWP_Matrix& m); //赋值运算符
CZWP_Matrix operator+(CZWP_Matrix& m);// 加运算符
CZWP_Matrix operator-( CZWP_Matrix& m);// 减运算符
CZWP_Matrix& operator++();// 自加运算符
CZWP_Matrix& operator--();// 自减运算符
CZWP_Matrix operator*( CZWP_Matrix& m);// 乘法运算符
CZWP_Matrix transpose();// 矩阵转置
CZWP_Matrix inverse();// 矩阵求逆
//属性函数
int getcol() const { return col; }
void setval(int r, int c, double value) { mat[r][c] = value; }
double getval(int r, int c) const { return mat[r][c]; } // 设置行、列的值
void setrow(int r) { row = r; }
int getrow() const { return row; }
void setcol(int c) { col = c; }
private:// 成员变量
double **mat;
int row;//行
int col; //列
}; 展开
之前也做过一个类似的矩阵计算的程序。我把我的代码贴出来给你,你自己根据需要修改下好了。思路就是按照矩阵的逆等于其伴随矩阵除以行列式。因此,可以先计算其伴随阵和行列式。
=======================================================================
void NUM_MIN_MAT(double mat[][N_MAX],double aim[][N_MAX],double Lamder,int Line,int Row)
{ /*矩阵数乘函数,要求输入原矩阵,目标矩阵,要乘的数,矩阵的行数及列数*/
int m,n;
for(m=0;m<Line;m++)
{for(n=0;n<Row;n++)
aim[m][n]=Lamder*mat[m][n]; //将每个数都乘以Lamder
}
}
void REMAIN_MAT(double mat[][N_MAX],double aim[][N_MAX],int l,int r,int l0,int r0)
{ /*求将第l行r列元素去掉以后的矩阵,要求输入原矩阵,目标矩阵,该元素的所在行数和列数以
及原矩阵的行数和列数,函数不修改原矩阵*/
int m,n;
for(m=0;m<l0;m++)
for(n=0;n<r0;n++)
aim[m][n]=mat[m][n];
for(m=l;m<l0-1;m++)
for(n=0;n<r0;n++)
aim[m][n]=mat[m+1][n];
for(n=r;n<r0-1;n++)
for(m=0;m<l0-1;m++)
aim[m][n]=aim[m][n+1];
}
double det(double mat[][N_MAX],int h)
{ /*方阵行列式函数,形参是该方阵及大小,函数返回行列式的值*/
double ak,ans=0.0; //定义第ak项,定义求和的值
int n,m,k;
if(h==1)
return mat[0][0]; //方阵为一阶时行列式为该元素的值
if(h==2)
return mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0]; //二阶时直接计算,函数的出口
else
{double modify[N_MAX][N_MAX]; //定义修改后的方阵存放在modify中,即ak的余子式
for(k=0;k<h;k++)
{ak=mat[0][k]; //ak存放第一行第k个数
REMAIN_MAT(mat,modify,0,k,h,h); //得到去掉第0行第k列后的子式
ans=ans+pow(-1,k)*ak*det(modify,h-1); //按按a[0]行展开用递归函数进行求和计算
}
return ans;
}
}
bool REVERSE_MAT(double mat[][N_MAX],double aim[][N_MAX],int h)
{ /*矩阵逆阵函数,要求输入原方阵阵,目标方阵,方阵的阶数,成功转置返回true,否则返回fa
lse*/
int m,n;
Clear_Mat(aim);
if(det(mat,h)==0)
return false;
else
{ double copy[N_MAX][N_MAX],company[N_MAX][N_MAX],remain[N_MAX][N_MAX]; //定义用来复制原矩阵从而可以进行修改的copy矩阵,及伴随矩阵
for(m=0;m<h;m++)
{for(n=0;n<h;n++)
{REMAIN_MAT(mat,remain,m,n,h,h);
company[n][m]=det(remain,h-1)*pow(-1,m+n);
}
NUM_MIN_MAT(company,aim,pow(det(mat,h),-1),h,h);
}
return true;
}
}
希望该结果能满意~~
你有想过怎么计算方针的行列式了么?
另外就是可以使用基本线性变换,(A E)=> (E A^(-1)), 把矩阵A逐步逐步地变成单位阵的时候, 单位阵就会变成逆矩阵
查看原帖>>
记得采纳啊