在研究工作中经常需要用到关于矩阵的各种运算,如果每当需要使用,就临时编写,就会特别费时费力这里将常见的矩阵计算算法做成“头文件+源文件”,日后需要使用,直接复制到文件目录下,在引用就可以了Matrix.h)#include using std :: vector;class Matrix{public: Matrix(int m, int n) { row = m; col = n; vector> B(m,vector(n));//定义一个m行n列的double型数组 A = B; }public: int row; int col; vector> A; };Matrix MatrixAdd(Matrix M1, Matrix M2);//矩阵相加Matrix MatrixSub(Matrix M1, Matrix M2);//矩阵相减Matrix MatrixMulti(Matrix M1, Matrix M2);//矩阵相乘Matrix MatrixSimpleMulti(int k, Matrix M1);//矩阵数乘Matrix MatrixTrans(Matrix M1);//矩阵转置Matrix MatrixInv(Matrix Ma);//矩阵求逆Matrix MatrixYuzishi(Matrix Ma,int r, int c);//求矩阵的余子式double det(Matrix M1, int n1);//求矩阵行列式(Matrix.cpp)#include "stdafx.h"#include "Matrix.h"#include /////////////////////////////矩阵相加///////////////////////////////////Matrix MatrixAdd(Matrix M1, Matrix M2){ int m1 = M1.row; int n1 = M1.col; int m2 = M2.row; int n2 = M2.col;//获得矩阵的行列数量 //if ((m1 != m2) || (n1 != n2)) //{ // //注意学习C++如何抛出异常,以后补上。
//} Matrix Mc(m1, n1); vector> &c = Mc.A; vector> &a = M1.A; vector> &b = M2.A;//这里一定要注意按地址传递或者传引用,否则在调用函数时就不能得出正确结果 for (int i = 0; i < m1; i++) { for (int j = 0; j < n1; j++) { c[i][j] = a[i][j] + b[i][j]; } } return Mc;}/////////////////////////////矩阵相减///////////////////////////////////Matrix MatrixSub(Matrix M1, Matrix M2){ int m1 = M1.row; int n1 = M1.col; int m2 = M2.row; int n2 = M2.col;//获得矩阵的行列数量 //if ((m1 != m2) || (n1 != n2)) //{ // //注意学习C++如何抛出异常,以后补上。
//} Matrix Mc(m1, n1); vector> &c = Mc.A; vector> &a = M1.A; vector> &b = M2.A;//这里一定要注意按地址传递或者传引用,否则在调用函数时就不能得出正确结果 for (int i = 0; i < m1; i++) { for (int j = 0; j < n1; j++) { c[i][j] = a[i][j] - b[i][j]; } } return Mc;}/////////////////////////////矩阵相乘///////////////////////////////////Matrix MatrixMulti(Matrix M1, Matrix M2){ int m1 = M1.row; int n1 = M1.col; int m2 = M2.row; int n2 = M2.col;//获得矩阵的行列数量 //判断M1,M2是否可以相乘 Matrix Mc(m1, n2); vector> &c = Mc.A; vector> &a = M1.A; vector> &b = M2.A;//这里一定要注意按地址传递或者传引用,否则在调用函数时就不能得出正确结果。
for (int i = 0; i < m1; i++) { for (int j = 0; j < n2; j++) { c[i][j] = 0; for (int k = 0; k < n2; k++) { c[i][j] += a[i][k] * b[k][j]; } } } return Mc;}/////////////////////////////矩阵数乘///////////////////////////////////Matrix MatrixSimpleMulti(int k, Matrix M1){ int m = M1.row; int n = M1.col; Matrix Mc(m, n); vector> &c = Mc.A; vector> &a = M1.A; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { c[i][j] = k * a[i][j]; } } return Mc;}/////////////////////////////矩阵转置///////////////////////////////////Matrix MatrixTrans(Matrix M1){ int m = M1.row; int n = M1.col; Matrix Mc(n,m); vector> &c = Mc.A; vector> &a = M1.A; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { c[i][j] = a[j][i]; } } return Mc;}/////////////////////////////矩阵求逆///////////////////////////////////Matrix MatrixInv(Matrix Ma){ int m = Ma.row; int n = Ma.col; Matrix Mc(m, n); vector> &a0 = Ma.A; vector> a = a0; vector> &b = Mc.A; int i, j, R, k; double max, temp; //定义一个单位阵 for (i = 0; i < n; i++) { b[i][i] = 1; } for (k = 0; k < n; k++) { max = 0; R = k; //寻找主元,并记录其行号R for (i = k; i < n; i++) { temp = abs(a[i][k]); if (max < temp) { max = temp; R = i; } } //if (max == 0)//如果主元为零,则表示矩阵为奇异阵,不可逆 //{ //} //交换k与R行 if (R != k) { for (j = 0; j < n; j++) { temp = a[R][j]; a[R][j] = a[k][j]; a[k][j] = temp; temp = b[R][j]; b[R][j] = b[k][j]; b[k][j] = temp; } } //将主元变为1 for ( j = k + 1; j < n; j++) { a[k][j] /= a[k][k]; } for (j = 0; j < n; j++) { b[k][j] /= a[k][k]; } a[k][k] = 1; //k列化为0 //对a矩阵 for (j = k + 1; j < n; j++) { for (i = 0; i < k; i++) { a[i][j] -= a[i][k] * a[k][j]; } for (i = k + 1; i < n; i++) { a[i][j] -= a[i][k] * a[k][j]; } } //对b矩阵 for (j = 0; j < n; j++) { for (i = 0; i < k; i++) { b[i][j] -= a[i][k] * b[k][j]; } for (i = k + 1; i < n; i++) { b[i][j] -= a[i][k] * b[k][j]; } } for (i = 0; i < n; i++) { a[i][k] = 0; } a[k][k] = 1; } return Mc;}/////////////////////////////矩阵行列式/////////////////////////////////double det(Matrix M1, int n1)//n1为矩阵M1的阶数{ int i_1, j_1, c; Matrix b(n1, n1); int p = 0, q =。