问题遇到的现象和发生背景
如何编写一个类来求逆矩阵
问题相关代码,请勿粘贴截图
#include
#include
#include //vector函数所包含的库
#include //调用reverse函数所包含的库
#include
using namespace std;
#include
using namespace std;
class matrix {
public:
int r, c; //r表示行,c表示列
int** mem;
matrix(int a, int b):r(a),c(b)
{
mem = new int* [a]; //堆区开辟一段内存 程序结束后需要手动释放
for (int i = 0; i < a; i++)
{
mem[i] = new int[b];
}
};
matrix(const matrix& p) //拷贝构造函数
{
r = p.r;
c = p.c;
mem = new int* [r]; //深拷贝,在堆区重新开辟一段内存,避免析构函数释放内存时重复释放同一块内存时而出错
for (int i = 0; i < r; i++)
{
mem[i] = new int[c];
}
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++) {
mem[i][j] = p.mem[i][j];
}
}
~matrix() //析构函数,释放在堆区开辟的内存
{
for (int i = 0; i < r; i++) {
delete[]mem[i];
}
delete[]mem;
};
//+运算符重载 也可以用全局函数来重载 matrix operatior+(const matrix& m1,const matrix& m2)
matrix operator+ (const matrix& m)
{
if (r != m.r || c != m.c) //判断是否为同型矩阵
{
cout << "请输入正确的类型的矩阵。";
matrix tmp(r, c); //调用构造函数
tmp.mem = NULL; //将该二维指针置空,避免出现野指针的情况
return tmp;
}
else {
matrix tmp(r, c);
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
tmp.mem[i][j] = mem[i][j] + m.mem[i][j];
return tmp;
}
}
matrix operator- (const matrix& m)
{
if (r != m.r || c != m.c)//判断是否符合相减的条件
{
cout << "请输入正确的类型的矩阵。";
matrix tmp(r, c);
tmp.mem = NULL;
return tmp;
}
else {
matrix tmp(r, c);
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
tmp.mem[i][j] = mem[i][j] - m.mem[i][j];
return tmp;
}
}
matrix operator* (const matrix& m)//矩阵乘
{
if (c != m.r) {
cout << "请输入正确的类型的矩阵。";
matrix tmp(r, c);
tmp.mem = NULL;
return tmp;
}
else {
matrix tmp(r, m.c);
for (int i = 0; i < r; i++)
for (int j = 0; j < m.c; j++)
tmp.mem[i][j] = 0;//初始化二维数组
for (int i = 0; i < tmp.r; i++)
for (int j = 0; j < tmp.c; j++)
for (int k = 0; k < c; k++)
tmp.mem[i][j] += (mem[i][k] * m.mem[k][j]);
return tmp;
}
}
//求逆运算
matrix operator/(const matrix& m)
{
double ret = getA(m);
if (m.r != m.c||ret==0)
{
cout << "请输入正确的类型的矩阵。";
matrix tmp(r, c);
tmp.mem = NULL;
return tmp;
}
else
{
matrix tmp(m.r, m.c);
for (int i = 0; i < r; i++)
for (int j = 0; j < m.c; j++)
tmp.mem[i][j] = 0;//初始化二维数组
for (int i = 0; i < tmp.r; i++)
for (int j = 0; j < tmp.c; j++)
tmp.mem[i][j] =
return tmp;
}
}
//按第一行展开计算|A|
double getA(const matrix&m)
{
if (m.r == 1&&m.c==1)
{
return mem[0][0];
}
double ans = 0;
matrix tmp(r, m.c);
for (int i = 0; i < r; i++)
for (int j = 0; j < m.c; j++)
tmp.mem[i][j] = 0;//初始化二维数组
int i, j, k;
for (i = 0; i < m.r; i++)
{
for (j = 0; j < m.r - 1; j++)
{
for (k = 0; k < m.r - 1; k++)
{
tmp.mem[j][k] = mem[j + 1][(k >= i) ? k + 1 : k];
}
}
double t = getA(tmp);
if (i % 2 == 0)
{
ans += tmp.mem[0][i] * t;
}
else
{
ans -= tmp.mem[0][i] * t;
}
}
return ans;
}
//计算每一行每一列的每个元素所对应的余子式,组成A*
matrix getAStart(const matrix& m)
{
if (m.r == 1&&m.c==1)
{
matrix tmp(r, c);
tmp.mem[0][0] = 1;
return tmp;
}
matrix tmp(r, m.c);
for (int i = 0; i < r; i++)
for (int j = 0; j < m.c; j++)
tmp.mem[i][j] = 0;//初始化二维数组
int i, j, k, t;
for (i = 0; i < m.r; i++)
{
for (j = 0; j < m.r; j++)
{
for (k = 0; k < m.r; k++)
{
for (t = 0; t < m.r; t++)
{
tmp.mem[k][t] = mem[k >= i ? k + 1 : k][t >= j ? t + 1 : t];
}
}
tmp.mem[j][i] = getA(tmp);
if ((i + j) % 2 == 1)
{
mem[j][i] = -mem[j][i];
}
}
return *this;
}
}
matrix& operator=(const matrix& m)
{
if (c != m.r) {
cout << "请输入正确的类型的矩阵。";
matrix tmp(r, c);
tmp.mem = NULL;
return tmp;
}
else {
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
mem[i][j] = m.mem[i][j];
return *this;
}
}
void display(matrix m)//输出矩阵
{
for (int i = 0; i < m.r; i++) {
for (int j = 0; j < m.c; j++) {
cout << m.mem[i][j] << ' ';
}
cout << endl;
}
cout << "====================================================================================" << endl;
}
};
运行结果及报错内容
不知道如何求逆矩阵