利用C++的类实现矩阵的运算,可实现矩阵的+-*运算,以及用高斯消去法求解线性方程组Ax=b
2018/10/13新增功能 矩阵的行列变换 高斯消元法得到上三角矩阵
头文件.h
/*
author: cclplus
date:2018/10/11
if you think it is necessary to reward me,
my alipay account number is [email protected]
*/
#ifndef __MATRIX_CLL_H__
#define __MATRIX_CCL_H__
#include <iostream>
class Matrix {
private:
int rows_num, cols_num;
double **p;
void initialize();//初始化矩阵
public:
Matrix(int, int);
Matrix(int, int, double);//预配分空间
virtual ~Matrix();//析构函数应当是虚函数,除非此类不用做基类
Matrix& operator=(const Matrix&);//矩阵的复制
Matrix& operator+=(const Matrix&);//矩阵的+=操作
Matrix& operator-=(const Matrix&);//-=
Matrix& operator*=(const Matrix&);//*=
static Matrix plus(const Matrix&, const Matrix&);//实现矩阵的加法
static Matrix Solve(const Matrix&, const Matrix&);//求解线性方程组Ax=b
void Show() const;//矩阵显示
void swapRows(int, int);
Matrix Getsize();//读取矩阵的行数和列数
Matrix Transpose();//矩阵转置的实现,且不改变矩阵
Matrix gaussianEliminate();//高斯消元法
friend std::istream& operator>>(std::istream&, Matrix&);//实现矩阵的输入
};
Matrix operator+(const Matrix&, const Matrix&);//重载操作运算符+
Matrix operator-(const Matrix&, const Matrix&);//重载操作运算符+
Matrix operator*(const Matrix&, const Matrix&);//重载操作运算符*
#endif
头文件.cpp
/*
author: cclplus
date:2018/10/11
if you think it is necessary to reward me,
my alipay account number is [email protected]
*/
#include <stdexcept>
#include <iostream>
#include <stdlib.h>
#include <cmath>
#include "matrix.h"
using std::endl;
using std::cout;
using std::istream;
const double eps_min = 1e-10;
void Matrix::initialize() {//初始化矩阵大小
p = new double*[rows_num];//分配rows_num个指针
for (int i = 0; i < rows_num; ++i) {
p[i] = new double[cols_num];//为p[i]进行动态内存分配,大小为cols
}
}
//声明一个全0矩阵
Matrix::Matrix(int rows, int cols)
{
rows_num = rows;
cols_num = cols;
initialize();
for (int i = 0; i < rows_num; i++) {
for (int j = 0; j < cols_num; j++) {
p[i][j] = 0;
}
}
}
//声明一个值全部为value的矩阵
Matrix::Matrix(int rows, int cols, double value)
{
rows_num = rows;
cols_num = cols;
initialize();
for (int i = 0; i < rows_num; i++) {
for (int j = 0; j < cols_num; j++) {
p[i][j] = value;
}
}
}
//析构函数
Matrix::~Matrix() {
}
//实现矩阵的复制
Matrix& Matrix::operator=(const Matrix& m)
{
if (this == &m) {
return *this;
}
if (rows_num != m.rows_num || cols_num != m.cols_num) {
for (int i = 0; i < rows_num; ++i) {
delete[] p[i];
}
delete[] p;
rows_num = m.rows_num;
cols_num = m.cols_num;
initialize();
}
for (int i = 0; i < rows_num; i++) {
for (int j = 0; j < cols_num; j++) {
p[i][j] = m.p[i][j];
}
}
return *this;
}
//+=操作
Matrix& Matrix::operator+=(const Matrix& m)
{
for (int i = 0; i < rows_num; i++) {
for (int j = 0; j < cols_num; j++) {
p[i][j] += m.p[i][j];
}
}
return *this;
}
//实现-=
Matrix& Matrix::operator-=(const Matrix& m)
{
for (int i = 0; i < rows_num; i++) {
for (int j = 0; j < cols_num; j++) {
p[i][j] -= m.p[i][j];
}
}
return *this;
}
//实现*=
Matrix& Matrix::operator*=(const Matrix& m)
{
Matrix temp(rows_num, m.cols_num);//若C=AB,则矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
for (int i = 0; i < temp.rows_num; i++) {
for (int j = 0; j < temp.cols_num; j++) {
for (int k = 0; k < cols_num; k++) {
temp.p[i][j] += (p[i][k] * m.p[k][j]);
}
}
}
*this = temp;
return *this;
}
//实现C=A+B
Matrix Matrix::plus(const Matrix &A, const Matrix &B) {
Matrix C(A.rows_num, A.cols_num);
for (int i = 0; i < C.rows_num; i++) {
for (int j = 0; j < C.cols_num; j++) {
C.p[i][j] = A.p[i][j] + B.p[i][j];
}
}
return C;
}
//解方程Ax=b
Matrix Matrix::Solve(const Matrix &A, const Matrix &b)
{
//高斯消去法实现Ax=b的方程求解
for (int i = 0; i < A.rows_num; i++) {
if (A.p[i][i] == 0) {
cout << "请重新输入" << endl;
}
for (int j = i + 1; j < A.rows_num; j++) {
for (int k = i + 1; k < A.cols_num; k++) {
A.p[j][k] -= A.p[i][k] * (A.p[j][i] / A.p[i][i]);
if (abs(A.p[j][k]) < eps_min)
A.p[j][k] = 0;
}
b.p[j][0] -= b.p[i][0] * (A.p[j][i] / A.p[i][i]);
if (abs(A.p[j][0]) < eps_min)
A.p[j][0] = 0;
A.p[j][i] = 0;
}
}
// 反向代换
Matrix x(b.rows_num, 1);
x.p[x.rows_num - 1][0] = b.p[x.rows_num - 1][0] / A.p[x.rows_num - 1][x.rows_num - 1];
if (abs(x.p[x.rows_num - 1][0]) < eps_min)
x.p[x.rows_num - 1][0] = 0;
for (int i = x.rows_num - 2; i >= 0; i--) {
double sum = 0;
for (int j = i + 1; j < x.rows_num; j++) {
sum += A.p[i][j] * x.p[j][0];
}
x.p[i][0] = (b.p[i][0] - sum) / A.p[i][i];
if (abs(x.p[i][0]) < eps_min)
x.p[i][0] = 0;
}
return x;
}
//矩阵显示
void Matrix::Show() const {
//cout << rows_num <<" "<<cols_num<< endl;//显示矩阵的行数和列数
cout << " " << endl;
for (int i = 0; i < rows_num; i++) {
for (int j = 0; j < cols_num; j++) {
cout << p[i][j] << " ";
}
cout << endl;
}
}
//实现行变换
void Matrix::swapRows(int a, int b)
{
a--;
b--;
double *temp = p[a];
p[a] = p[b];
p[b] = temp;
}
//读取矩阵行列数
Matrix Matrix::Getsize()
{
Matrix temp(2, 1);
temp.p[0][0] = rows_num;
temp.p[1][0] = cols_num;
return temp;
}
//实现矩阵的转置
Matrix Matrix::Transpose()
{
Matrix mt(cols_num, rows_num);
for (int i = 0; i < rows_num; i++) {
for (int j = 0; j < cols_num; j++) {
mt.p[j][i] = p[i][j];
}
}
return mt;
}
//高斯消元法
Matrix Matrix::gaussianEliminate()
{
Matrix Ab(*this);
int rows = Ab.rows_num;
int cols = Ab.cols_num;
int Acols = cols - 1;
int i = 0; //跟踪行
int j = 0; //跟踪列
while (i < rows)
{
bool flag = false;
while (j < Acols && !flag)
{
if (Ab.p[i][j] != 0) {
flag = true;
}
else {
int max_row = i;
double max_val = 0;
for (int k = i + 1; k < rows; ++k)
{
double cur_abs = Ab.p[k][j] >= 0 ? Ab.p[k][j] : -1 * Ab.p[k][j];
if (cur_abs > max_val)
{
max_row = k;
max_val = cur_abs;
}
}
if (max_row != i) {
Ab.swapRows(max_row, i);
flag = true;
}
else {
j++;
}
}
}
if (flag)
{
for (int t = i + 1; t < rows; t++) {
for (int s = j + 1; s < cols; s++) {
Ab.p[t][s] = Ab.p[t][s] - Ab.p[i][s] * (Ab.p[t][j] / Ab.p[i][j]);
if (abs(Ab.p[t][s]) < eps_min)
Ab.p[t][s] = 0;
}
Ab.p[t][j] = 0;
}
}
i++;
j++;
}
return Ab;
}
//实现矩阵的输入
istream& operator>>(istream& is, Matrix& m)
{
for (int i = 0; i < m.rows_num; i++) {
for (int j = 0; j < m.cols_num; j++) {
is >> m.p[i][j];
}
}
return is;
}
//实现矩阵+
Matrix operator+(const Matrix& A, const Matrix& B)
{
Matrix C = A;
C += B;
return C;
}
//实现矩阵的减法
Matrix operator-(const Matrix& A, const Matrix& B)
{
Matrix C = A;
C -= B;
return C;
}
//实现矩阵的乘法
Matrix operator*(const Matrix& A, const Matrix& B)
{
Matrix C = A;
C *= B;
return C;
}
主程序
#include "matrix.h"
using namespace std;
int main()
{
Matrix A = Matrix(3, 3);
cin >> A;
Matrix b = Matrix(3, 1);
cin >> b;
Matrix x = Matrix::Solve(A, b);
x.Show();
return 0;
}
运行结果
新功能使用方法
A.gaussianEliminate();//将A通过高斯消元法后得到上三角矩阵,保存为A
A.swapRows(3, 1);//转换矩阵A的第三行和第一行