Matrix.h文件
#pragma once
#include <iostream>
#include<math.h>
#include<iomanip>
#include<string.h>
using namespace std;
class Matrix
{
public:
Matrix();
Matrix(int a, int b);
Matrix(const Matrix & one);
~Matrix();
void Input();
void operator=(const Matrix &m);
friend Matrix operator+(const Matrix &a, const Matrix & b);
friend Matrix operator*(const Matrix & a,const Matrix & b);
Matrix Transpose();
Matrix Inverse();
void Show();
public:
int row;
int col;
double **array;
};
Matrix.cpp
#include "Matrix.h"
Matrix::Matrix()
{
cout << "矩阵的行:";
cin >> row;
cout << "矩阵的列:";
cin >> col;
array = new double*[row];
for (int i = 0; i < row; i++)
{
array[i] = new double[col];
}
Input();
}
Matrix::Matrix(int a, int b)
{
row = a;
col = b;
array = new double*[row];
for (int i = 0; i < row; i++)
{
array[i] = new double[col];
}
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
array[i][j] = 0;
}
}
}
Matrix::Matrix(const Matrix & one)
{
row = one.row;
col = one.col;
array = new double*[row];
for (int i = 0; i < row; i++)
{
array[i] = new double[col];
}
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
array[i][j] = one.array[i][j];
}
}
}
Matrix::~Matrix()
{
for (int i = 0; i < row; i++)
delete[]array[i];
delete[]array;
}
void Matrix::Input()
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
cin >> array[i][j];
}
}
}
void Matrix::operator=(const Matrix & one)
{
row = one.row;
col = one.col;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
array[i][j] = one.array[i][j];
}
}
}
Matrix operator+(const Matrix & a, const Matrix & b)
{
if (a.row == b.row&& a.col == b.col)
{
Matrix c(a.row, b.col);
for (int i = 0; i < a.row; i++)
{
for (int j = 0; j < a.col; j++)
{
c.array[i][j] = a.array[i][j] +
b.array[i][j];
}
}
return c;
}
else
cout << "矩阵无法相加" << endl;
}
Matrix operator*(const Matrix & a, const Matrix & b)
{
if (a.row == b.col || a.col == b.row)
{
if (a.col == b.row)
{
Matrix c(a.row, b.col);
for (int i = 0; i < a.row; i++)
{
for (int z = 0; z < b.col; z++)
{
for (int j = 0; j < a.col; j++)
{
c.array[i][z] = c.array[i][z] + a.array[i][j] * b.array[j][z];
}
}
}
return c;
}
else if (a.row == b.col)
{
Matrix c(a.row, b.col);
for (int i = 0; i < b.row; i++)
{
for (int z = 0; z < a.col; z++)
{
for (int j = 0; j < b.col; j++)
{
c.array[i][z] = c.array[i][z] + b.array[i][j] * a.array[j][z];
}
}
}
return c;
}
}
else
cout << "两矩阵无法相乘" << endl;
}
Matrix Matrix::Transpose()
{
Matrix b(col, row);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
b.array[j][i] = array[i][j];
}
return b;
}
Matrix Matrix::Inverse()
{
int i, j, n, test;
Matrix a(row, col);
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
a.array[i][j] = array[i][j];
}
}
Matrix b(row, col);
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (i == j)
b.array[i][j] = 1;
else
b.array[i][j] = 0;
}
}
int r = 0, c = 0;
double nu, num;
n = row;
for (i = 0; i < n; i++)
{
r = 0;
for (int j = 0; j < n; j++)
{
if (a.array[i][j] == 0)
{
r = r + 1;
}
}
if (r == n)
break;
}
for (j = 0; j < n; j++)
{
c = 0;
for (i = 0; i < n; i++)
{
if (a.array[i][j] == 0)
{
c = c + 1;
}
}
if (c == n)
break;
}
if (r != n && c != n)
{
i = 0;
j = 0;
for (test = 0; test < n; test++)
{
r = test, c = test;
for (; a.array[r][c] == 0; r++)
{
if (r == n - 1)
break;
}
for (j = 0, c = 0; j < n; j++)
{
num = a.array[r][c];
nu = a.array[test][j];
a.array[test][j] = num;
a.array[r][c] = nu;
num = b.array[r][c];
nu = b.array[test][j];
b.array[test][j] = num;
b.array[r][c] = nu;
c++;
}
for (i = test; i < n; i++)
{
j = test;
if (i == j)
i++;
if (i == n)
break;
num = a.array[i][j] / a.array[test][j];
for (j = 0; j < n; j++)
{
a.array[i][j] = a.array[i][j] - a.array[test][j] * num;
b.array[i][j] = b.array[i][j] - b.array[test][j] * num;
}
}
}
for (i = 0; i < n; i++)
{
r = 0;
for (int j = 0; j < n; j++)
{
if (a.array[i][j] == 0)
{
r = r + 1;
}
}
if (r == n)
break;
}
for (j = 0; j < n; j++)
{
c = 0;
for (i = 0; i < n; i++)
{
if (a.array[i][j] == 0)
{
c = c + 1;
}
}
if (c == n)
break;
}
if (r != n && c != n)
{
for (i = 0, j = 0, test = 0; test < n; test++)
{
i = test, j = test;
r = test, c = test;
num = a.array[i][j];
for (j = 0; j < n; j++)
{
a.array[i][j] = a.array[i][j] / num;
b.array[i][j] = b.array[i][j] / num;
}
for (i = 0; i < test; i++)
{
j = test;
num = a.array[i][j];
for (j = 0; j < n; j++)
{
a.array[i][j] = a.array[i][j] - a.array[test][j] * num;
b.array[i][j] = b.array[i][j] - b.array[test][j] * num;
}
}
}
return b;
}
else
{
cout << "矩阵不可逆" << endl;
}
}
else
{
cout << "矩阵不可逆" << endl;
}
}
void Matrix::Show()
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (fabs(array[i][j]) < 10e-10)
{
array[i][j] = 0;
}
cout << fixed << setprecision(4) << array[i][j] << ",";
}
cout << endl;
}
}