实现了程序矩阵的 加减乘除求逆等操作,通过vector建立二维矩阵进行计算。
- 主要实现方法为通过对运算符进行重载来实现运算操作。
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
class Matrix
{
public:
Matrix();
Matrix(Matrix &Temp);
Matrix(vector<vector<double>> A);
Matrix(vector<double> Vec,int col);
~Matrix();
void resize(int row, int column);
void InputData(vector<vector<double>> A);
Matrix& operator=(Matrix &A);
Matrix& operator+(Matrix &A);
Matrix& operator+=(Matrix &A);
Matrix& operator*(Matrix &A);
Matrix& operator^(int t);
Matrix& operator/(Matrix &A);
Matrix& Adj();
vector<double> operator[](int a);
double det();
public:
vector<vector<double>> Array;
};
ostream& operator<<(ostream& output, Matrix& A);
Matrix temper;
Matrix temper1;
Matrix::Matrix()
{
this->resize(1, 1);
}
Matrix::Matrix(Matrix &Temp)
{
vector<vector<double>> Array(Temp.Array);
}
Matrix::Matrix(vector<double> Vec, int col)
{
int length = Vec.size();
int row = length / col;
this->resize(row, col);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
Array[i][j] = Vec[i*col + j];
}
}
}
Matrix::Matrix(vector<vector<double>> A)
{
int row = A.size();
int col = A[0].size();
this->resize(row, col);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
this->Array[i][j] = A[i][j];
}
}
Matrix::~Matrix()
{
Array.~vector<vector<double>>();
}
void Matrix::resize(int row, int column)
{
Array.resize(row);
for (int i = 0; i < Array.size(); i++)
Array[i].resize(column);
}
void Matrix::InputData(vector<vector<double>> A)
{
int row = A.size();
int col = A[0].size();
this->resize(row, col);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
this->Array[i][j] = A[i][j];
}
}
}
Matrix& Matrix::operator=(Matrix& A)
{
int row = A.Array.size();
int col = A.Array[0].size();
this->resize(row, col);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
this->Array[i][j] = A.Array[i][j];
}
}
return *this;
}
Matrix& Matrix::operator+=(Matrix& A)
{
int r1, r2, c1, c2;
r1 = A.Array.size();
r2 = this->Array.size();
c1 = A.Array[0].size();
c2 = this->Array[0].size();
if (r1 == r2 &&c1 == c2)
{
for (int i = 0; i < r1; i++)
{
for (int j = 0; j < c1; j++)
{
this->Array[i][j] = this->Array[i][j] + A.Array[i][j];
}
}
}
else
{
cerr << "Error! The size of Matrix is wrong!" << endl;
}
return *this;
}
Matrix& Matrix::operator+(Matrix &A)
{
temper = *this;
temper += A;
return temper;
}
Matrix& Matrix::operator*(Matrix &A)
{
int row = this->Array.size();
int col = A.Array[0].size();
temper.resize(row, col);
double t = 1;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
t = 0;
for (int a = 0; a < this->Array[0].size(); a++)
t += this->Array[i][a] * A.Array[a][j];
temper.Array[i][j] = t;
}
}
return temper;
}
vector<double> Matrix::operator[](int a)
{
return this->Array[a];
}
Matrix& Matrix::operator^(int t)
{
temper = *this;
int row = this->Array.size();
int col = this->Array[0].size();
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
temper[i][j] = pow(temper[i][j], t);
}
}
return temper;
}
double reduce_order(vector<vector<double>> vec, int n)
{
if (n == 1)
{
return vec[0][0];
}
else
{
int sum = 0;
for (int i = 0; i < n; i++)
{
vector<vector<double>> s;
for (int j = 1; j < n; j++)
{
vector<double> t;
for (int k = 0; k < n; k++)
{
if (k != i)
{
t.push_back(vec[j][k]);
}
}
s.push_back(t);
}
sum += pow(-1, i)*vec[0][i] * reduce_order(s, n - 1);
}
return sum;
}
}
double Matrix::det()
{
int row = this->Array.size();
int col = this->Array[0].size();
double res;
if (row != col)
{
cerr << "The Matrix's row must be equal to it's column!" << endl;
return 0.000;
}
res = reduce_order(this->Array, row);
return res;
}
Matrix& Matrix::Adj()
{
int row = this->Array.size();
int col = this->Array[0].size();
temper.resize(row, col);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
vector<vector<double>> Mat;
for (int a = 0; a < row; a++)
{
vector<double> line;
for (int b = 0; b < col; b++)
{
if (b != j)
line.push_back(this->Array[a][b]);
}
if (a != i)
Mat.push_back(line);
}
temper1.InputData(Mat);
int A = temper1.det();
temper[i][j] = A;
}
}
return temper;
}
Matrix& Matrix::operator/(Matrix& A)
{
int row1 = this->Array.size();
int col1 = this->Array[0].size();
int row2 = A.Array.size();
int col2 = A.Array[0].size();
double Adet = A.det();
temper.resize(row2, col2);
temper1 = A.Adj;
for (int i = 0; i < row2; i++)
{
for (int j = 0; j < col2; j++)
{
temper1.Array[i][j] = temper1.Array[i][j] / Adet;
}
}
temper = *this*temper1;
return temper;
}
ostream& operator<<(ostream& output,Matrix &A)
{
for (int i = 0; i < A.Array.size(); i++)
{
for (int j = 0; j < A.Array[i].size(); j++)
{
output << A.Array[i][j] << " ";
}
output << endl;
}
return output;
}
int main()
{
vector<double> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(2);
a.push_back(2);
a.push_back(1);
a.push_back(3);
a.push_back(4);
a.push_back(3);
vector<double>c;
for (int i = 1; i <= 9; i++)
{
c.push_back((double)i);
}
Matrix x(c, 2);
vector<double> b(a);
Matrix Test1(c, 3);
Matrix Test2(a, 3);
cout << Test2.det() << endl;
system("pause");
return 0;
}