当前位置: 首页 > news >正文

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元,干翻Ansys的目标”,基本框架为前端显示使用QT实现交互,后端计算采用Visual Studio C++。

目录

Matrix类

1、public function

1.1、构造函数与析构函数

1.2、获取矩阵数值

1.3、设置矩阵

1.4、矩阵转置、单位化

1.5、矩阵的删除与替换

1.6、矩阵初等变换

1.7、矩阵加法

1.8、矩阵乘法

1.9、行列式相关操作

1.10、矩阵求逆

2、private variable

3、全部源码


Matrix类

矩阵基本类,用于有限元矩阵计算。

1、public function

公共成员函数,调用可实现基本运算

1.1、构造函数与析构函数

构造函数用来初始化矩阵,析构函数用来释放内存。

Matrix.h声明文件:

	/*函数名称:		无参构造函数*/Matrix();/*函数名称:		矩阵有参构造函数,初始化为row行、col列的0矩阵row:			矩阵行数col:			矩阵列数*/Matrix(int row, int col);/*函数名称:		矩阵有参构造函数,初始化为row行、col列、数值为mat的矩阵row:			矩阵行数col:			矩阵列数*mat:			矩阵数值一维数组*/Matrix(int row, int col, double* mat);/*函数名称:		深拷贝构造函数mat:			需要复制的矩阵*/Matrix(const Matrix& mat);/*函数名称:		析构函数*/~Matrix();

Matrix.cpp函数实现文件:

Matrix::Matrix()
{}//初始化矩阵 默认值为0
Matrix::Matrix(int row, int col)
{this->m_Row = row;this->m_Col = col;//开辟内存this->m_Matrix = new double* [row];for (int i = 0; i < row; i++){this->m_Matrix[i] = new double[col] {0.0};}}//初始化矩阵 设定数值
Matrix::Matrix(int row, int col, double *mat)
{this->m_Row = row;this->m_Col = col;//开辟内存this->m_Matrix = new double* [row];for (int i = 0; i < row; i++){this->m_Matrix[i] = new double[col] {0.0};}//矩阵赋值for(int i = 0; i<row; i++){for (int j = 0; j < col; j++){this->m_Matrix[i][j] = mat[i * col + j];}}
}//深拷贝
Matrix::Matrix(const Matrix& mat)
{//行列传递this->m_Row = mat.m_Row;this->m_Col = mat.m_Col;//矩阵深拷贝this->m_Matrix = new double* [this->m_Row];for (int i = 0; i < this->m_Row; i++){this->m_Matrix[i] = new double[this->m_Col];memcpy(this->m_Matrix[i], mat.m_Matrix[i], sizeof(double) * this->m_Col);}
}//析构函数
Matrix::~Matrix()
{//释放矩阵每一行for (int i = 0; i < this->m_Row; i++){if (this->m_Matrix[i] != NULL){delete[]this->m_Matrix[i];this->m_Matrix[i] = NULL;}}//释放矩阵顶点if (this->m_Matrix != NULL){delete[]this->m_Matrix;this->m_Matrix = NULL;}
}

1.2、获取矩阵数值

可以获取矩阵指定位置数值、打印矩阵。

Matrix.h声明文件:

	//*******************获取矩阵*****************///*函数名称:		获取矩阵的第row行、第col列元素数值row:			矩阵行数col:			矩阵列数*/double GetMatrixEle(int row, int col);/*函数名称:		打印矩阵*/void PrintMat();

Matrix.cpp函数实现文件:

//获取矩阵某个元素 某行某列
double Matrix::GetMatrixEle(int row, int col)
{if (row >= this->m_Row){std::cout << "Error: <GetMatrixEle> Input row >= m_Row" << std::endl;return 0.0;}else if (col >= this->m_Col){std::cout << "Error: <GetMatrixEle> Input col >= m_Col" << std::endl;return 0.0;}else{return this->m_Matrix[row][col];}
}//矩阵输出
void Matrix::PrintMat()
{for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){std::cout.setf(std::ios::scientific);		//科学计数法表示std::cout << this->m_Matrix[i][j] << "\t";}std::cout << std::endl;}std::cout << std::endl;
}

测试验证:

测试代码:

#include "Matrix.h"
int main()
{//定义矩阵数值double tempValue[9] = {1.0, 2.0, 3.0,4.0, 5.0, 6.0,7.0, 8.0, 0.0};//创建矩阵Matrix* tempMatrix = new Matrix(3, 3, tempValue);//打印矩阵tempMatrix->PrintMat();system("pause");return 0;
}

应用输出:

1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00请按任意键继续. . .

1.3、设置矩阵

可进行设置矩阵指定位置数值,以及深拷贝矩阵。

Matrix.h声明文件:

	/*函数名称:		设置矩阵第row行、第col列数值row:			矩阵行数col:			矩阵列数value:			设置的矩阵数值*/void SetMatrixEle(int row, int col, double value);/*函数名称:		深拷贝矩阵mat:			需要复制的矩阵*/Matrix CopyMat(const Matrix mat);

Matrix.cpp函数实现文件:

//*******************设置矩阵*****************//
void Matrix::SetMatrixEle(int row, int col, double value)
{if (row >= this->m_Row){std::cout << "Error: <SetMatrixEle> Input row >= m_Row" << std::endl;return;}else if (col >= this->m_Col){std::cout << "Error: <SetMatrixEle> Input col >= m_Col" << std::endl;return;}else{this->m_Matrix[row][col] = value;return;}
}//深拷贝矩阵
Matrix Matrix::CopyMat(const Matrix mat)
{//行列传递this->m_Row = mat.m_Row;this->m_Col = mat.m_Col;//矩阵深拷贝this->m_Matrix = new double* [this->m_Row];for (int i = 0; i < this->m_Row; i++){this->m_Matrix[i] = new double[this->m_Col];memcpy(this->m_Matrix[i], mat.m_Matrix[i], sizeof(double) * this->m_Col);}return *this;
}

测试验证:

测试代码:

int main()
{//定义矩阵数值double tempValue[9] = {1.0, 2.0, 3.0,4.0, 5.0, 6.0,7.0, 8.0, 0.0};//创建矩阵Matrix* tempMatrix = new Matrix(3, 3, tempValue);//打印矩阵std::cout << "数值更改前:" << std::endl;tempMatrix->PrintMat();//更改特定值tempMatrix->SetMatrixEle(1, 1, 10.0);//打印矩阵std::cout << "数值更改后:" << std::endl;tempMatrix->PrintMat();system("pause");return 0;
}

应用输出:

数值更改前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00数值更改后:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    1.000000e+01    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00请按任意键继续. . .

1.4、矩阵转置、单位化

可进行矩阵转置,单位化,注意返回值类型为自身的引用,可实现链式编程。

Matrix.h声明文件:

	/*函数名称:		矩阵转置,返回的是自身引用,可链式调用*/Matrix& Transpose();/*函数名称:		等维度的单位矩阵,前提是方阵*/Matrix& Uint();

Matrix.cpp函数实现文件:

//矩阵转置
Matrix& Matrix::Transpose()
{Matrix* resMat = new Matrix(this->m_Col, this->m_Row);for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){resMat->m_Matrix[j][i] = this->m_Matrix[i][j];}}return *resMat;
}//求等长度单位矩阵
Matrix& Matrix::Uint()
{//矩阵是否为方阵if (this->m_Col != this->m_Row){std::cout << "Error: <Uint> Row != Col" << std::endl;Matrix* resMat = new Matrix(this->m_Row, this->m_Row);return *resMat;}else{//单位矩阵初始化Matrix* resMat = new Matrix(this->m_Row, this->m_Col);//单位矩阵生成for (int i = 0; i < this->m_Row; i++){resMat->m_Matrix[i][i] = 1.0;}return *resMat;}
}

测试验证:

测试代码:

int main()
{//定义矩阵数值double tempValue[9] = {1.0, 2.0, 3.0,4.0, 5.0, 6.0,7.0, 8.0, 0.0};//创建矩阵Matrix* tempMatrix = new Matrix(3, 3, tempValue);//打印矩阵std::cout << "数值转置前:" << std::endl;tempMatrix->PrintMat();//打印矩阵(注意可链式编程)std::cout << "数值转置后:" << std::endl;tempMatrix->Transpose().PrintMat();system("pause");return 0;
}

应用输出:

数值转置前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00数值转置后:
1.000000e+00    4.000000e+00    7.000000e+00
2.000000e+00    5.000000e+00    8.000000e+00
3.000000e+00    6.000000e+00    0.000000e+00请按任意键继续. . .

1.5、矩阵的删除与替换

可进行矩阵指定行、列的删除与替换,注意返回值类型为自身的引用,可实现链式编程。

Matrix.h声明文件:

	/*函数名称:		剔除矩阵中以index为行标和列标的行和列,num代表index的大小*index:			矩阵中的行号与列号一维数组num:			index动态数组长度*/Matrix& DeleteMat(int *index, int num);/*函数名称:		剔除矩阵中以index为行标和列标的行和列,num代表index的大小*index:			矩阵中的行号与列号一维动态数组num:			index动态数组长度*/Matrix& DeleteMat(std::vector<int> index, int num);/*函数名称:		剔除矩阵中以index为行标的行,num代表index的大小*index:			矩阵中的行号一维数组num:			index动态数组长度*/Matrix& DeleteRow(int* index, int num);/*函数名称:		剔除矩阵中以index为行标的行,num代表index的大小*index:			矩阵中的行号一维动态数组num:			index动态数组长度*/Matrix& DeleteRow(std::vector<int> index, int num);/*函数名称:		剔除矩阵中以index为列标的列,num代表index的大小*index:			矩阵中的列号一维数组num:			index动态数组长度*/Matrix& DeleteCol(int* index, int num);/*函数名称:		剔除矩阵中以index为列标的列,num代表index的大小*index:			矩阵中的列号一维动态数组num:			index动态数组长度*/Matrix& DeleteCol(std::vector<int> index, int num);//******************矩阵的替换****************///*函数名称:		替换矩阵中行标和列标为 index中的行与列,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的行标和列标的一维数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceMat(int* index, int num, Matrix& mat);/*函数名称:		替换矩阵中行标和列标为 index中的行与列,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的行标和列标的一维动态数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceMat(std::vector<int> index, int num, Matrix& mat);/*函数名称:		替换矩阵中行标为 index中的行,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的行标的一维数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceRow(int* index, int num, Matrix& mat);/*函数名称:		替换矩阵中行标为 index中的行,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的行标的一动态维数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceRow(std::vector<int> index, int num, Matrix& mat);/*函数名称:		替换矩阵中列标为 index中的列,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的列标的一维数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceCol(int* index, int num, Matrix& mat);/*函数名称:		替换矩阵中列标为 index中的列,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的列标的一维动态数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceCol(std::vector<int> index, int num, Matrix& mat);

Matrix.cpp函数实现文件:

//****************矩阵保留与剔除**************//
//剔除矩阵的 index中的行与列,num代表index的大小
Matrix& Matrix::DeleteMat(int* index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row - num, this->m_Col - num);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}else if (index[i] >= this->m_Col){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num-1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[recIndex[iRow]][recIndex[iCol]];}}return *resMat;}Matrix& Matrix::DeleteMat(std::vector<int> index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row - num, this->m_Col - num);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}else if (index[i] >= this->m_Col){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[recIndex[iRow]][recIndex[iCol]];}}return *resMat;
}//剔除矩阵的 index中的行,num代表index的大小
Matrix& Matrix::DeleteRow(int* index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row - num, this->m_Col);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[recIndex[iRow]][iCol];}}return *resMat;
}Matrix& Matrix::DeleteRow(std::vector<int> index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row - num, this->m_Col);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[recIndex[iRow]][iCol];}}return *resMat;
}Matrix& Matrix::DeleteCol(int* index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row, this->m_Col - num);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[iRow][recIndex[iCol]];}}return *resMat;
}Matrix& Matrix::DeleteCol(std::vector<int> index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row, this->m_Col - num);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[iRow][recIndex[iCol]];}}return *resMat;
}//******************矩阵的替换****************//
//替换矩阵中的行和列 index中的行与列,num代表index的大小
Matrix& Matrix::ReplaceMat(int* index, int num, Matrix& mat)
{//错误判定 方阵if (this->m_Row != this->m_Col){std::cout << "Error: <ReplaceMat> this m_Col != m_Row" << std::endl;return *this;}//检验插入矩阵为方阵if (mat.m_Row != mat.m_Col){std::cout << "Error: <ReplaceMat> mat m_Col != m_Row" << std::endl;return *this;}//检验插入矩阵大小与num保持一致if (mat.m_Col != num){std::cout << "Error: <ReplaceMat> num != mat.m_Col" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <ReplaceMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}else if (index[i] >= this->m_Col){std::cout << "Error: <ReplaceMat> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < num; iRow++){for (int iCol = 0; iCol < num; iCol++){resMat->m_Matrix[index[iRow]][index[iCol]] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}Matrix& Matrix::ReplaceMat(std::vector<int> index, int num, Matrix& mat)
{//错误判定 方阵if (this->m_Row != this->m_Col){std::cout << "Error: <ReplaceMat> this m_Col != m_Row" << std::endl;return *this;}//检验插入矩阵为方阵if (mat.m_Row != mat.m_Col){std::cout << "Error: <ReplaceMat> mat m_Col != m_Row" << std::endl;return *this;}//检验插入矩阵大小与num保持一致if (mat.m_Col != num){std::cout << "Error: <ReplaceMat> num != mat.m_Col" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <ReplaceMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}else if (index[i] >= this->m_Col){std::cout << "Error: <ReplaceMat> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < num; iRow++){for (int iCol = 0; iCol < num; iCol++){resMat->m_Matrix[index[iRow]][index[iCol]] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}//替换矩阵中的行 index中的行,num代表index的大小, mat是需要替换的矩阵
Matrix& Matrix::ReplaceRow(int* index, int num, Matrix& mat)
{//检验插入矩阵大小与num保持一致if (mat.m_Row != num){std::cout << "Error: <ReplaceRow> num != mat.m_Row" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <ReplaceRow> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//当前矩阵列数应与mat列数一致if (this->m_Col != mat.m_Col){std::cout << "Error: <ReplaceRow> this->m_Col != mat.m_Col" << std::endl;return *this;}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < num; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[index[iRow]][iCol] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}Matrix& Matrix::ReplaceRow(std::vector<int> index, int num, Matrix& mat)
{//检验插入矩阵大小与num保持一致if (mat.m_Row != num){std::cout << "Error: <ReplaceRow> num != mat.m_Row" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <ReplaceRow> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//当前矩阵列数应与mat列数一致if (this->m_Col != mat.m_Col){std::cout << "Error: <ReplaceRow> this->m_Col != mat.m_Col" << std::endl;return *this;}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < num; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[index[iRow]][iCol] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}//替换矩阵中的列 index中的列,num代表index的大小, mat是需要替换的矩阵
Matrix& Matrix::ReplaceCol(int* index, int num, Matrix& mat)
{//检验插入矩阵大小与num保持一致if (mat.m_Col != num){std::cout << "Error: <ReplaceCol> mat.m_Col != num" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Col){std::cout << "Error: <ReplaceCol> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//当前矩阵行数应与mat行数一致if (this->m_Row != mat.m_Row){std::cout << "Error: <ReplaceCol> this->m_Row != mat.m_Row" << std::endl;return *this;}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < num; iCol++){resMat->m_Matrix[iRow][index[iCol]] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}Matrix& Matrix::ReplaceCol(std::vector<int> index, int num, Matrix& mat)
{//检验插入矩阵大小与num保持一致if (mat.m_Col != num){std::cout << "Error: <ReplaceCol> mat.m_Col != num" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Col){std::cout << "Error: <ReplaceCol> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//当前矩阵行数应与mat行数一致if (this->m_Row != mat.m_Row){std::cout << "Error: <ReplaceCol> this->m_Row != mat.m_Row" << std::endl;return *this;}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < num; iCol++){resMat->m_Matrix[iRow][index[iCol]] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}

测试验证:

测试代码:

int main()
{//定义矩阵数值double tempValue[9] = {1.0, 2.0, 3.0,4.0, 5.0, 6.0,7.0, 8.0, 0.0};//替换数值double replaceValue[3] = {1.42, 2.54, 9.65};//创建矩阵Matrix* tempMatrix = new Matrix(3, 3, tempValue);Matrix* tempReplaceMatrix = new Matrix(1, 3, replaceValue);int replaceCol[1] = {2};//打印矩阵std::cout << "数值第3行替换前:" << std::endl;tempMatrix->PrintMat();//打印矩阵(注意可链式编程)std::cout << "数值第3行替换后:" << std::endl;tempMatrix->ReplaceRow(replaceCol, 1, *tempReplaceMatrix).PrintMat();//打印矩阵std::cout << "数值第3行删除前:" << std::endl;tempMatrix->PrintMat();//打印矩阵(注意可链式编程)std::cout << "数值第3行删除后:" << std::endl;tempMatrix->DeleteRow(replaceCol, 1).PrintMat();system("pause");return 0;
}

应用输出:

数值第3行替换前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00数值第3行替换后:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
1.420000e+00    2.540000e+00    9.650000e+00数值第3行删除前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00数值第3行删除后:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00请按任意键继续. . .

1.6、矩阵初等变换

可实现矩阵的初等变化,注意返回值类型为自身的引用,可实现链式编程。

Matrix.h声明文件:

	//*****************矩阵初等变化***************///*函数名称:		交换矩阵中行标为row0与row1的元素row0:			矩阵行标0row1:			矩阵行标1*/Matrix& SwapRow(int row0, int row1);/*函数名称:		交换矩阵中列标为col0与col1的元素col0:			矩阵列标0col1:			矩阵列标1*/Matrix& SwapCol(int col0, int col1);/*函数名称:		矩阵行加法 rowLocal = rowLocal + rate *rowAddrowLocal:		矩阵行标,被加数rowAdd:			矩阵行标,加数rate:			加数前倍数*/Matrix& AddRow(int rowLocal, int rowAdd, double rate = 1.0);//矩阵加法 某列 + 倍数*某列/*函数名称:		矩阵列加法 colLocal = colLocal + rate * colAddcolLocal:		矩阵列标,被加数colAdd:			矩阵列标,加数rate:			加数前倍数*/Matrix& AddCol(int colLocal, int colAdd, double rate = 1.0);//*******************矩阵加法*****************///*函数名称:		矩阵加法 本矩阵 = 本矩阵 + mat 前提是两个矩阵维度一致mat:			加数矩阵*/Matrix& AddMat(Matrix& mat);

Matrix.cpp函数实现文件:

//*****************矩阵初等变化***************//
Matrix& Matrix::SwapRow(int row0, int row1)
{//错误判定 越界if ((this->m_Row <= row0) || (this->m_Col <= row1)){std::cout << "Error: <SwapRow> Input row0 Or row1 More Than m_Row" << std::endl;return *this;}else if ((0 > row0) || (0 > row1)){std::cout << "Error: <SwapRow> Input row0 Or row1 Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//中转临时变量double temp = 0.0;for (int j = 0; j < resMat->m_Col; j++){temp = resMat->m_Matrix[row0][j];resMat->m_Matrix[row0][j] = resMat->m_Matrix[row1][j];resMat->m_Matrix[row1][j] = temp;}return*resMat;}
}Matrix& Matrix::SwapCol(int col0, int col1)
{//错误判定 越界if ((this->m_Col <= col0) || (this->m_Col <= col1)){std::cout << "Error: <SwapCol> Input col0 Or col1 More Than m_Col" << std::endl;return *this;}else if ((0 > col0) || (0 > col1)){std::cout << "Error: <SwapCol> Input col0 Or col1 Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//中转临时变量double temp = 0.0;for (int i = 0; i < resMat->m_Row; i++){temp = resMat->m_Matrix[i][col0];resMat->m_Matrix[i][col0] = resMat->m_Matrix[i][col1];resMat->m_Matrix[i][col1] = temp;}return*resMat;}
}//矩阵加法 某行 + 倍数*某行
Matrix& Matrix::AddRow(int rowLocal, int rowAdd, double rate)
{if ((this->m_Row <= rowLocal) || (this->m_Row <= rowAdd)){std::cout << "Error: <AddRow> Input rowLocal Or rowAdd More Than m_Row" << std::endl;return *this;}else if ((0 > rowLocal) || (0 > rowAdd)){std::cout << "Error: <AddRow> Input rowLocal Or rowAdd Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//指定行相加for (int j = 0; j < resMat->m_Col; j++){resMat->m_Matrix[rowLocal][j] += rate * resMat->m_Matrix[rowAdd][j];}return *resMat;}
}//矩阵加法 某列 + 倍数*某列
Matrix& Matrix::AddCol(int colLocal, int colAdd, double rate)
{if ((this->m_Col <= colLocal) || (this->m_Col <= colAdd)){std::cout << "Error: <AddCol> Input colLocal Or colAdd More Than m_Col" << std::endl;return *this;}else if ((0 > colLocal) || (0 > colAdd)){std::cout << "Error: <AddCol> Input colLocal Or colAdd Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//指定列相加for (int i = 0; i < resMat->m_Row; i++){resMat->m_Matrix[i][colLocal] += rate * resMat->m_Matrix[i][colAdd];}return *resMat;}
}

测试验证:

测试代码:

int main()
{//定义矩阵数值double tempValue[9] = {1.0, 2.0, 3.0,4.0, 5.0, 6.0,7.0, 8.0, 0.0};//创建矩阵Matrix* tempMatrix = new Matrix(3, 3, tempValue);//打印矩阵std::cout << "************************" << std::endl;std::cout << "数值第1行与第3行交换前:" << std::endl;tempMatrix->PrintMat();//打印矩阵(注意可链式编程)std::cout << "数值第1行与第3行交换后:" << std::endl;tempMatrix->SwapRow(0, 2).PrintMat();//打印矩阵std::cout << "************************" << std::endl;std::cout << "数值第1行与第3行相加前:" << std::endl;tempMatrix->PrintMat();//打印矩阵(注意可链式编程)std::cout << "数值第1行与第3行相加后:" << std::endl;tempMatrix->AddRow(0, 2).PrintMat();system("pause");return 0;
}

应用输出:

************************
数值第1行与第3行交换前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00数值第1行与第3行交换后:
7.000000e+00    8.000000e+00    0.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
1.000000e+00    2.000000e+00    3.000000e+00************************
数值第1行与第3行相加前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00数值第1行与第3行相加后:
8.000000e+00    1.000000e+01    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00请按任意键继续. . .

1.7、矩阵加法

实现矩阵基本加法,注意返回值类型为自身的引用,可实现链式编程。

Matrix.h声明文件:

	//*******************矩阵加法*****************///*函数名称:		矩阵加法 本矩阵 = 本矩阵 + mat 前提是两个矩阵维度一致mat:			加数矩阵*/Matrix& AddMat(Matrix& mat);

Matrix.cpp函数实现文件:

//*******************矩阵加法*****************//
Matrix& Matrix::AddMat(Matrix& mat)
{Matrix* ResMat = new Matrix(*this);for (int i = 0; i < ResMat->m_Row; i++){for (int j = 0; j < ResMat->m_Col; j++){ResMat->m_Matrix[i][j] += mat.m_Matrix[i][j];}}return *ResMat;
}

测试验证:

测试代码:

int main()
{//定义矩阵数值double tempValue0[9] = {1.0, 2.0, 3.0,4.0, 5.0, 6.0,7.0, 8.0, 0.0};//定义矩阵数值double tempValue1[9] = {2.0, 5.0, 8.0,1.0, 5.0, 9.0,3.0, 6.0, 7.0};//创建矩阵Matrix* tempMatrix0 = new Matrix(3, 3, tempValue0);Matrix* tempMatrix1 = new Matrix(3, 3, tempValue1);//打印矩阵std::cout << "************************" << std::endl;std::cout << "数值矩阵相加前:" << std::endl;tempMatrix0->PrintMat();//打印矩阵(注意可链式编程)std::cout << "数值矩阵相加后:" << std::endl;tempMatrix0->AddMat(*tempMatrix1).PrintMat();system("pause");return 0;
}

应用输出:

************************
数值矩阵相加前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00数值矩阵相加后:
3.000000e+00    7.000000e+00    1.100000e+01
5.000000e+00    1.000000e+01    1.500000e+01
1.000000e+01    1.400000e+01    7.000000e+00请按任意键继续. . .

1.8、矩阵乘法

实现矩阵基本乘法,注意返回值类型为自身的引用,可实现链式编程。

Matrix.h声明文件:

	//*******************矩阵乘法*****************///*函数名称:		矩阵乘法 本矩阵 = 本矩阵*num num:			矩阵乘数*/Matrix& MultNum(double num);/*函数名称:		矩阵乘法(运算符重载) 本矩阵 = 本矩阵*num num:			矩阵乘数*/Matrix& operator * (double num);/*函数名称:		矩阵某行乘数值row = row*numnum:			矩阵某列乘数row:			矩阵行标*/Matrix& MultRow(double num, int row);/*函数名称:		矩阵某列乘数值col = col *numnum:			矩阵某列乘数col:			矩阵列标*/Matrix& MultCol(double num, int col);/*函数名称:		矩阵乘法,按照矩阵相乘规则inputMat:		乘数矩阵*/Matrix& MultMat(Matrix& inputMat);

Matrix.cpp函数实现文件:

//*******************矩阵乘法*****************//
//矩阵数乘
Matrix& Matrix::MultNum(double num)
{//结果矩阵初始化Matrix* resMat = new Matrix(this->m_Row, this->m_Col);//乘后矩阵生成for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){resMat->m_Matrix[i][j] = num * this->m_Matrix[i][j];}}return *resMat;
}//运算符重载 矩阵数乘
Matrix& Matrix::operator*(double num)
{//结果矩阵初始化Matrix* resMat = new Matrix(this->m_Row, this->m_Col);//乘后矩阵生成for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){resMat->m_Matrix[i][j] = num * this->m_Matrix[i][j];}}return *resMat;
}//矩阵某行乘数值 行标从0开始计数
Matrix& Matrix::MultRow(double num, int row)
{if (this->m_Row <= row){std::cout << "Error: <MultRow> Input row More Than m_Row" << std::endl;return *this;}else if (0 > row){std::cout << "Error: <MultRow> Input row Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//乘后矩阵生成for (int j = 0; j < this->m_Col; j++){resMat->m_Matrix[row][j] = num * this->m_Matrix[row][j];}return *resMat;}}//矩阵某列乘数值 列标从0开始计数
Matrix& Matrix::MultCol(double num, int col)
{if (this->m_Col <= col){std::cout << "Error: <MultCol> Input col More Than m_Row" << std::endl;return *this;}else if (0 > col){std::cout << "Error: <MultCol> Input col Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//乘后矩阵生成for (int i = 0; i < this->m_Row; i++){resMat->m_Matrix[i][col] = num * this->m_Matrix[i][col];}return *resMat;}
}//矩阵相乘
Matrix& Matrix::MultMat(Matrix& inputMat)
{Matrix *resMat = new Matrix(this->m_Row, inputMat.m_Col);if (this->m_Col != inputMat.m_Row){std::cout << "Matrix Mult Error!" << std::endl;return *resMat;}else{for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < inputMat.m_Col; j++){for (int k = 0; k < this->m_Col; k++){resMat->m_Matrix[i][j] += this->m_Matrix[i][k] * inputMat.m_Matrix[k][j];}}}return *resMat;}
}

测试验证:

测试代码:

int main()
{//定义矩阵数值double tempValue0[9] = {1.0, 2.0, 3.0,4.0, 5.0, 6.0,7.0, 8.0, 0.0};//定义矩阵数值double tempValue1[9] = {2.0, 5.0, 8.0,1.0, 5.0, 9.0,3.0, 6.0, 7.0};//创建矩阵Matrix* tempMatrix0 = new Matrix(3, 3, tempValue0);Matrix* tempMatrix1 = new Matrix(3, 3, tempValue1);//打印矩阵std::cout << "************************" << std::endl;std::cout << "数值矩阵相乘前:" << std::endl;tempMatrix0->PrintMat();//打印矩阵(注意可链式编程)std::cout << "数值矩阵相乘后:" << std::endl;tempMatrix0->MultMat(*tempMatrix1).PrintMat();system("pause");return 0;
}

应用输出:

************************
数值矩阵相乘前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00数值矩阵相乘后:
1.300000e+01    3.300000e+01    4.700000e+01
3.100000e+01    8.100000e+01    1.190000e+02
2.200000e+01    7.500000e+01    1.280000e+02请按任意键继续. . .

matlab验证:

>> tempMatrix0 = [1 2 3;4 5 6; 7 8 0];
>> tempMatrix1 = [2 5 8;1 5 9; 3 6 7];
>> res = tempMatrix0*tempMatrix1res =13    33    4731    81   11922    75   128

1.9、行列式相关操作

实现行列式计算相关操作。

Matrix.h声明文件:

	//******************行列式相关操作***********************///*函数名称:		求解矩阵对应行列式数值,前提为方阵,按照定义求解,时间复杂度为O(n!*n),一般不用此方法求解*/double Det();/*函数名称:		求解矩阵对应行列式的顺序主子式,前提为方阵,按照定义求解,时间复杂度为O(n!*n),一般不用此方法求解order:			阶数*/double Det(int order);/*函数名称:		矩阵行标为row、列标为col的余子式row:			矩阵行标col:			矩阵列标*/Matrix& ChildMatrix(int row, int col);/*函数名称:		通过高斯列主消元求解矩阵行列式数值,最为常用*/double DetRow();

Matrix.cpp函数实现文件:

//矩阵的行列式数值
double Matrix::Det()
{double res = 0.0;int sign = 1;if (this->m_Row != this->m_Col){//错误判定std::cout << "Error: <Det> Matrix Col != Row" << std::endl;return 0;}else if (this->m_Row <= 1){//程序终止出口return this->m_Matrix[0][0];}else{for (int i = 0; i < this->m_Col; i++){Matrix* temp = &(this->ChildMatrix(0, i));res += sign * this->m_Matrix[0][i] * (temp->Det());sign = -1*sign;delete temp;}}}//矩阵行列式顺序主子式 order阶数
double Matrix::Det(int order)
{if (this->m_Row != this->m_Col){//错误判定std::cout << "Error: <Det> Matrix Col != Row" << std::endl;return 0;}else if (order < 0){std::cout << "Error: <Det>  Input Order Less 0" << std::endl;return 0;}else if (order >= this->m_Row){std::cout << "Error: <Det> Input Order More Than Row" << std::endl;return 0;}else{Matrix tempMat(order + 1, order + 1);for (int i = 0; i < tempMat.m_Col; i++){for (int j = 0; j < tempMat.m_Row; j++){tempMat.m_Matrix[i][j] = this->m_Matrix[i][j];}}return tempMat.Det();}
}//求解余子式
Matrix& Matrix::ChildMatrix(int row, int col)
{if (this->m_Row != this->m_Col){std::cout << "Error: <ChildMatrix> Matrix row != col" << std::endl;return *this;}else if (this->m_Row <= 1){std::cout << "Error: <ChildMatrix> Matrix Row Less 1 " << std::endl;return *this;}else if ((row > this->m_Row) || (col > this->m_Col)){std::cout << "Error: <ChildMatrix> Input Row Or Col More Than Matix Max Row Or Col" << std::endl; return* this; }else{Matrix* resMat = new Matrix(this->m_Row-1, this->m_Col-1);for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){if ((i < row) && (j < col))resMat->m_Matrix[i][j] = this->m_Matrix[i][j];else if((i > row) && (j < col))resMat->m_Matrix[i-1][j] = this->m_Matrix[i][j];else if((i < row) && (j > col))resMat->m_Matrix[i][j - 1] = this->m_Matrix[i][j];else if((i > row) && (j > col))resMat->m_Matrix[i - 1][j - 1] = this->m_Matrix[i][j];}}return *resMat;}
}//列主消元处理为上三角矩阵
double Matrix::DetRow()
{//交换标志位 1代表偶数次交换 -1代表奇数次交换int flagShift = 1;//本矩阵Matrix *localMat = new Matrix(*this);//行列式数值double resDet = 1.0;//*******************通过交换 num1*i + num2*j 实现下三角为0***************//for (int i = 0; i < localMat->m_Row - 1; i++){//记录最大行所在行标int tempMaxRow = i;for (int i1 = i + 1; i1 < localMat->m_Row; i1++){if (abs(localMat->m_Matrix[i1][i]) > abs(localMat->m_Matrix[tempMaxRow][i])){tempMaxRow = i1;}}if (tempMaxRow != i){//std::cout << i << " 行交换" << tempMaxRow << " 行" << std::endl;//进行交换 将当前第i行与第tempMaxRow行进行互换 初等行变换*localMat = localMat->SwapRow(i, tempMaxRow);//记录交换次数flagShift = -flagShift;//localMat->PrintMat();}//此对角线以下的元素通过初等变化为0for (int i2 = i + 1; i2 < localMat->m_Row; i2++){if (localMat->m_Matrix[i2][i] != 0){//std::cout << "<" << localMat->m_Matrix[i][i] << "> *" << i2 << " 行 + <" << -1.0 * (localMat->m_Matrix[i2][i]) << "> *" << i << " 行" << std::endl;*localMat = localMat->AddRow(i2, i, -1.0 * (localMat->m_Matrix[i2][i]) / localMat->m_Matrix[i][i]);//localMat->PrintMat();}}}//计算行列式数值 对角线相乘for (int i = 0; i < localMat->m_Row; i++){resDet = resDet * localMat->m_Matrix[i][i];}//矩阵交换一次就会变号resDet = flagShift * resDet;//清理localMatrixdelete localMat;return resDet;
}

测试验证:

测试代码:

int main()
{//定义矩阵数值double tempValue0[9] = {1.0, 2.0, 3.0,4.0, 5.0, 6.0,7.0, 8.0, 0.0};//创建矩阵Matrix* tempMatrix0 = new Matrix(3, 3, tempValue0);//打印矩阵std::cout << "************************" << std::endl;std::cout << "高斯列主消元过程:" << std::endl;std::cout << tempMatrix0->DetRow() << std::endl;system("pause");return 0;
}

应用输出:

************************
高斯列主消元过程:
0 行交换2 行
7.000000e+00    8.000000e+00    0.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
1.000000e+00    2.000000e+00    3.000000e+00<7.000000e+00> *1 行 + <-4.000000e+00> *0 行
7.000000e+00    8.000000e+00    0.000000e+00
0.000000e+00    4.285714e-01    6.000000e+00
1.000000e+00    2.000000e+00    3.000000e+00<7.000000e+00> *2 行 + <-1.000000e+00> *0 行
7.000000e+00    8.000000e+00    0.000000e+00
0.000000e+00    4.285714e-01    6.000000e+00
0.000000e+00    8.571429e-01    3.000000e+001 行交换2 行
7.000000e+00    8.000000e+00    0.000000e+00
0.000000e+00    8.571429e-01    3.000000e+00
0.000000e+00    4.285714e-01    6.000000e+00<8.571429e-01> *2 行 + <-4.285714e-01> *1 行
7.000000e+00    8.000000e+00    0.000000e+00
0.000000e+00    8.571429e-01    3.000000e+00
0.000000e+00    5.551115e-17    4.500000e+002.700000e+01
请按任意键继续. . .

Matlab验证:

>> tempMatrix0 = [1 2 3;4 5 6; 7 8 0];
>> det(tempMatrix0)ans =27.0000

1.10、矩阵求逆

实现矩阵求逆相关操作

Matrix.h声明文件:

	//*********************矩阵求逆********************///*函数名称:		矩阵求逆,按照定义求解,1/|A|*(A*),时间复杂度为O(n!*n),一般不用此方法*/Matrix& Inverse();/*函数名称:		矩阵求逆,通过行初等变化,高斯列主消元法求解*/Matrix& InverseRow();/*函数名称:		矩阵求逆,只针对于下三角矩阵进行求解*/Matrix& InverseDownTriangle();/*函数名称:		矩阵求逆,只针对于上三角矩阵进行求解*/Matrix& InverseUpTriangle();//矩阵LU分解/*函数名称:		矩阵LU分解LMat:			矩阵分解后的L矩阵UMat:			矩阵分解后的U矩阵*/void ResolveLU(Matrix& LMat, Matrix& UMat);/*函数名称:		矩阵的LUP分解 P*A = L*U 添加了列主消元功能LMat:			矩阵分解后的L矩阵UMat:			矩阵分解后的U矩阵PMat:			矩阵分解后的P矩阵*/void ResolveLUP(Matrix& LMat, Matrix& UMat, Matrix& PMat);

Matrix.cpp函数实现文件:

//矩阵求逆
Matrix& Matrix::Inverse()
{if (abs(this->DetRow()) < MIN_DET){std::cout << "Error: <Inverse> Matrix Det Near 0" << std::endl;return *this;}else{Matrix* resMat = new Matrix(this->m_Row, this->m_Col);for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){Matrix* temp = &(this->ChildMatrix(j, i));resMat->m_Matrix[i][j] = pow(-1.0, (i + j)) / this->DetRow() * (temp->DetRow());delete temp;}}return *resMat;}
}//矩阵求逆 行初等变化
Matrix& Matrix::InverseRow()
{//错误判断if (abs(this->DetRow()) < MIN_DET){std::cout << "Error: <InverseRow> Matrix Det Near 0" << std::endl;return *this;}else if (this->m_Row <= 1){std::cout << "Error: <InverseRow> Size Less 2" << std::endl;return *this;}else{//单位矩阵 与带转换矩阵维度相同的Matrix uint = this->Uint();//结果矩阵 逆矩阵 初始状态与本矩阵相同 为不使本矩阵发生改变Matrix temp(this->m_Row, this->m_Col);Matrix* resMat = new Matrix(temp.Uint());//本矩阵Matrix localMat(*this);//*******************通过交换 num1*i + num2*j 实现下三角为0***************//for (int i = 0; i < localMat.m_Row - 1; i++){//记录最大行所在行标int tempMaxRow = i;for (int i1 = i + 1; i1 < localMat.m_Row; i1++){if (abs(localMat.m_Matrix[i1][i]) > abs(localMat.m_Matrix[tempMaxRow][i])){tempMaxRow = i1;}}if (tempMaxRow != i){//std::cout << i << " 行交换" << tempMaxRow << " 行" << std::endl;//进行交换 将当前第i行与第tempMaxRow行进行互换 初等行变换localMat = localMat.SwapRow(i, tempMaxRow);*resMat = resMat->SwapRow(i, tempMaxRow);//localMat.PrintMat();}//此对角线以下的元素通过初等变化为0for (int i2 = i + 1; i2 < localMat.m_Row; i2++){if (localMat.m_Matrix[i2][i] != 0){//std::cout << "<" << localMat.m_Matrix[i][i] << "> *" << i2 << " 行 + <" << -1.0 * (localMat.m_Matrix[i2][i]) << "> *" << i << " 行" << std::endl;*resMat = resMat->AddRow(i2, i, -1.0 * (localMat.m_Matrix[i2][i]) / localMat.m_Matrix[i][i]);localMat = localMat.AddRow(i2, i, -1.0 * (localMat.m_Matrix[i2][i]) / localMat.m_Matrix[i][i]);//localMat.PrintMat();}}}//错误判断if (localMat.m_Matrix[localMat.m_Row - 1][localMat.m_Col - 1] == 0){std::cout << "Error: <InverseRow> marix[" << localMat.m_Row - 1 << "][" << localMat.m_Col - 1 <<"] == 0" << std::endl;return *this;}//*******************通过 num1*i + num2*j 实现上三角为0***************//for (int i = localMat.m_Row - 1; i > 0; i--){for (int i2 = i - 1; i2 >= 0; i2--){if (localMat.m_Matrix[i2][i] != 0){//std::cout << "<" << localMat.m_Matrix[i][i] << "> *" << i2 << " 行 + <" << -1.0 * (localMat.m_Matrix[i2][i]) << "> *" << i << " 行" << std::endl;*resMat = resMat->AddRow(i2, i, -1.0 * (localMat.m_Matrix[i2][i]) / localMat.m_Matrix[i][i]);localMat = localMat.AddRow(i2, i, -1.0 * (localMat.m_Matrix[i2][i]) / localMat.m_Matrix[i][i]);//localMat.PrintMat();}}}//*******************通过 i*num 实现矩阵为单位矩阵***************//for (int i = 0; i < localMat.m_Row; i++){if (localMat.m_Matrix[i][i] == 0){std::cout << "Error: <InverseRow> matrix[" << i << "]" << "[" << i << "] == 0" << std::endl;return *this;}else{//std::cout << "<" << 1 / localMat.m_Matrix[i][i] << "> *" << i << " 行" << std::endl;*resMat = resMat->MultRow(1 / localMat.m_Matrix[i][i], i);localMat = localMat.MultRow(1 / localMat.m_Matrix[i][i], i);//localMat.PrintMat();}}return *resMat;}
}//矩阵求逆 下三角矩阵
Matrix& Matrix::InverseDownTriangle()
{//错误判断 方阵检测if (this->m_Row != this->m_Col){std::cout << "Error: <InverseDownTriangle> Matrix Col != Row" << std::endl;return *this;}//下三角求逆Matrix* resMat = new Matrix(*this);for (int i = 0; i < resMat->m_Row; i++){for (int j = 0; j <= i; j++){//分段求解 对角线为倒数if (i == j){resMat->m_Matrix[i][j] = 1 / resMat->m_Matrix[i][j];}else{//分段求解 非对角线元素 double tempSum = 0.0;for (int k = j; k <= i - 1; k++){tempSum += resMat->m_Matrix[i][k] * resMat->m_Matrix[k][j];}resMat->m_Matrix[i][j] = -1.0*tempSum / resMat->m_Matrix[i][i];}}}return *resMat;}//矩阵求逆 上三角矩阵
Matrix& Matrix::InverseUpTriangle()
{//错误判断 方阵检测if (this->m_Row != this->m_Col){std::cout << "Error: <InverseUpTriangle> Matrix Col != Row" << std::endl;return *this;}//上三角求逆Matrix* resMat = new Matrix(*this);for (int j = resMat->m_Col-1; j >=0; j--){for (int i = j; i >=0; i--){//分段求解 对角线为倒数if (i == j){resMat->m_Matrix[i][j] = 1 / resMat->m_Matrix[i][j];}else{//分段求解 非对角线元素 double tempSum = 0.0;for (int k = j; k >= i+1; k--){tempSum += resMat->m_Matrix[i][k] * resMat->m_Matrix[k][j];}resMat->m_Matrix[i][j] = -1.0 * tempSum / resMat->m_Matrix[i][i];}}}return *resMat;
}//矩阵LU分解 顺序分解 对于病态矩阵可能存在精度问题
void Matrix::ResolveLU(Matrix& LMat, Matrix& UMat)
{if (this->m_Col != this->m_Row){std::cout << "Error: <ResolveLU> Is Not Square Matrix" << std::endl;return;}//存在性判定 顺序主子式不为0for (int i = 0; i < this->m_Row; i++){if (this->Det(i) == 0){std::cout << "Error: <ResolveLU> order Det = 0" << std::endl;return;}}//LU 分解//L矩阵为单位矩阵LMat = this->Uint();//U矩阵初始化为空矩阵Matrix temp(this->m_Row, this->m_Col);UMat = temp;for (int i = 0; i < this->m_Row; i++){//计算Ufor (int j1 = i; j1 < this->m_Col; j1++){double tempSum1 = 0.0;if (i != 0){for (int j2 = 0; j2 <= i - 1; j2++){tempSum1 += LMat.m_Matrix[i][j2] * UMat.m_Matrix[j2][j1];}}UMat.m_Matrix[i][j1] = this->m_Matrix[i][j1] - tempSum1;}//计算Lfor (int i1 = i; i1 < this->m_Row; i1++){double tempSum2 = 0.0;if (i != 0){for (int j2 = 0; j2 <= i - 1; j2++){tempSum2 += LMat.m_Matrix[i1][j2] * UMat.m_Matrix[j2][i];}}LMat.m_Matrix[i1][i] = (this->m_Matrix[i1][i] - tempSum2)/UMat.m_Matrix[i][i];}}}//矩阵的LUP分解 P*A = L*U 添加了列主消元功能 
//L为主对角线元素为1的下三角矩阵 U为上二角矩阵 P为行交换矩阵 P*A=L*U
void Matrix::ResolveLUP(Matrix& LMat, Matrix& UMat, Matrix& PMat)
{//条件判断 矩阵行列式不为0if (this->Det() == 0){std::cout << "Error: <ResolveLUP> Can't Resolve Matrix To L U P" << std::endl;return;}//初始化 L U PLMat = this->Uint();PMat = this->Uint();UMat = *this;//进行分解计算for (int i = 0; i < UMat.m_Row - 1; i++){//记录最大行所在行标int tempMaxRow = i;for (int i1 = i + 1; i1 < UMat.m_Row; i1++){if (abs(UMat.m_Matrix[i1][i]) > abs(UMat.m_Matrix[tempMaxRow][i])){tempMaxRow = i1;}}//进行交换 将当前第i行与第tempMaxRow行进行互换 初等行变换UMat = UMat.SwapRow(i, tempMaxRow);//L矩阵做出对应交换 先交换<itempMaxRow>列再交换<itempMaxRow>行LMat = LMat.SwapCol(i, tempMaxRow);LMat = LMat.SwapRow(i, tempMaxRow);//P矩阵做出对应变换 交换<itempMaxRow>行PMat = PMat.SwapRow(i, tempMaxRow);//高斯消元 V矩阵消除下三角区域,L矩阵添加下三角区域for (int i1 = i + 1; i1 < UMat.m_Row; i1++){//记录消元系数double deleteVar = UMat.m_Matrix[i1][i] / UMat.m_Matrix[i][i];//L矩阵列填充LMat.m_Matrix[i1][i] = deleteVar;//U矩阵列消除UMat = UMat.MultRow(UMat.m_Matrix[i][i], i1).AddRow(i1, i, -1.0 * UMat.m_Matrix[i1][i]).MultRow(1 / UMat.m_Matrix[i][i], i1);}}return;
}

测试验证:

测试代码:

int main()
{//定义矩阵数值double tempValue0[9] = {1.0, 2.0, 3.0,4.0, 5.0, 6.0,7.0, 8.0, 0.0};//创建矩阵Matrix* tempMatrix0 = new Matrix(3, 3, tempValue0);Matrix* tempMatrix0L = new Matrix(3, 3);Matrix* tempMatrix0U = new Matrix(3, 3);Matrix* tempMatrix0P = new Matrix(3, 3);//打印矩阵std::cout << "************************" << std::endl;std::cout << "矩阵求逆前:" << std::endl;tempMatrix0->PrintMat();std::cout << "矩阵求逆后:" << std::endl;tempMatrix0->InverseRow().PrintMat();std::cout << "求逆验证:" << std::endl;tempMatrix0->MultMat(tempMatrix0->InverseRow()).PrintMat();std::cout << "************************" << std::endl;std::cout << "矩阵LU分解前:" << std::endl;tempMatrix0->PrintMat();std::cout << "矩阵LU分解后:" << std::endl;tempMatrix0->ResolveLUP(*tempMatrix0L, *tempMatrix0U, *tempMatrix0P);std::cout << "矩阵L:" << std::endl;tempMatrix0L->PrintMat();std::cout << "矩阵U:" << std::endl;tempMatrix0U->PrintMat();std::cout << "矩阵P:" << std::endl;tempMatrix0P->PrintMat();system("pause");return 0;
}

应用输出:

************************
矩阵求逆前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00矩阵求逆后:
-1.777778e+00   8.888889e-01    -1.111111e-01
1.555556e+00    -7.777778e-01   2.222222e-01
-1.111111e-01   2.222222e-01    -1.111111e-01求逆验证:
1.000000e+00    -1.110223e-16   0.000000e+00
-2.220446e-16   1.000000e+00    0.000000e+00
1.776357e-15    -8.881784e-16   1.000000e+00************************
矩阵LU分解前:
1.000000e+00    2.000000e+00    3.000000e+00
4.000000e+00    5.000000e+00    6.000000e+00
7.000000e+00    8.000000e+00    0.000000e+00矩阵LU分解后:
矩阵L:
1.000000e+00    0.000000e+00    0.000000e+00
1.428571e-01    1.000000e+00    0.000000e+00
5.714286e-01    5.000000e-01    1.000000e+00矩阵U:
7.000000e+00    8.000000e+00    0.000000e+00
0.000000e+00    8.571429e-01    3.000000e+00
0.000000e+00    0.000000e+00    4.500000e+00矩阵P:
0.000000e+00    0.000000e+00    1.000000e+00
1.000000e+00    0.000000e+00    0.000000e+00
0.000000e+00    1.000000e+00    0.000000e+00请按任意键继续. . .

matlab验证:

>> tempMatrix0 = [1 2 3; 4 5 6; 7 8 0];
>> tempMatrix0^-1ans =-1.7778    0.8889   -0.11111.5556   -0.7778    0.2222-0.1111    0.2222   -0.1111>> [L, U, P] = lu(tempMatrix0)L =1.0000         0         00.1429    1.0000         00.5714    0.5000    1.0000U =7.0000    8.0000         00    0.8571    3.00000         0    4.5000P =0     0     11     0     00     1     0

2、private variable

私有成员变量

	double** m_Matrix;						//矩阵int m_Row;								//矩阵行数int m_Col;								//矩阵列数

3、全部源码

为了方便大家复制应用,这里直接贴出源码

Matrix.h声明文件:

#ifndef _MATRIX_H_
#define _MATRIX_H_
#include <iostream>
#include <math.h>
#include <vector>//矩阵最大容量
#define MAX_COUNT 500
#define MIN_DET 1e-12				//行列式最小数值class Matrix
{
public://******************************构造函数与析构函数********************************///*函数名称:		无参构造函数*/Matrix();/*函数名称:		矩阵有参构造函数,初始化为row行、col列的0矩阵row:			矩阵行数col:			矩阵列数*/Matrix(int row, int col);/*函数名称:		矩阵有参构造函数,初始化为row行、col列、数值为mat的矩阵row:			矩阵行数col:			矩阵列数*mat:			矩阵数值一维数组*/Matrix(int row, int col, double* mat);/*函数名称:		深拷贝构造函数mat:			需要复制的矩阵*/Matrix(const Matrix& mat);/*函数名称:		析构函数*/~Matrix();//*******************获取矩阵*****************///*函数名称:		获取矩阵的第row行、第col列元素数值row:			矩阵行数col:			矩阵列数*/double GetMatrixEle(int row, int col);//*******************设置矩阵*****************///*函数名称:		设置矩阵第row行、第col列数值row:			矩阵行数col:			矩阵列数value:			设置的矩阵数值*/void SetMatrixEle(int row, int col, double value);/*函数名称:		深拷贝矩阵mat:			需要复制的矩阵*/Matrix CopyMat(const Matrix mat);//********************************矩阵的相关计算**********************************////*******************打印矩阵*****************///*函数名称:		打印矩阵*/void PrintMat();//*****************矩阵基本操作***************///*函数名称:		矩阵转置,返回的是自身引用,可链式调用*/Matrix& Transpose();/*函数名称:		等维度的单位矩阵,前提是方阵*/Matrix& Uint();//****************矩阵保留与剔除**************///*函数名称:		剔除矩阵中以index为行标和列标的行和列,num代表index的大小*index:			矩阵中的行号与列号一维数组num:			index动态数组长度*/Matrix& DeleteMat(int *index, int num);/*函数名称:		剔除矩阵中以index为行标和列标的行和列,num代表index的大小*index:			矩阵中的行号与列号一维动态数组num:			index动态数组长度*/Matrix& DeleteMat(std::vector<int> index, int num);/*函数名称:		剔除矩阵中以index为行标的行,num代表index的大小*index:			矩阵中的行号一维数组num:			index动态数组长度*/Matrix& DeleteRow(int* index, int num);/*函数名称:		剔除矩阵中以index为行标的行,num代表index的大小*index:			矩阵中的行号一维动态数组num:			index动态数组长度*/Matrix& DeleteRow(std::vector<int> index, int num);/*函数名称:		剔除矩阵中以index为列标的列,num代表index的大小*index:			矩阵中的列号一维数组num:			index动态数组长度*/Matrix& DeleteCol(int* index, int num);/*函数名称:		剔除矩阵中以index为列标的列,num代表index的大小*index:			矩阵中的列号一维动态数组num:			index动态数组长度*/Matrix& DeleteCol(std::vector<int> index, int num);//******************矩阵的替换****************///*函数名称:		替换矩阵中行标和列标为 index中的行与列,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的行标和列标的一维数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceMat(int* index, int num, Matrix& mat);/*函数名称:		替换矩阵中行标和列标为 index中的行与列,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的行标和列标的一维动态数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceMat(std::vector<int> index, int num, Matrix& mat);/*函数名称:		替换矩阵中行标为 index中的行,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的行标的一维数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceRow(int* index, int num, Matrix& mat);/*函数名称:		替换矩阵中行标为 index中的行,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的行标的一动态维数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceRow(std::vector<int> index, int num, Matrix& mat);/*函数名称:		替换矩阵中列标为 index中的列,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的列标的一维数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceCol(int* index, int num, Matrix& mat);/*函数名称:		替换矩阵中列标为 index中的列,num代表index的大小, mat是需要替换的矩阵*index:			矩阵中的列标的一维动态数组num:			index动态数组长度mat:			需要替换的矩阵*/Matrix& ReplaceCol(std::vector<int> index, int num, Matrix& mat);//*****************矩阵初等变化***************///*函数名称:		交换矩阵中行标为row0与row1的元素row0:			矩阵行标0row1:			矩阵行标1*/Matrix& SwapRow(int row0, int row1);/*函数名称:		交换矩阵中列标为col0与col1的元素col0:			矩阵列标0col1:			矩阵列标1*/Matrix& SwapCol(int col0, int col1);/*函数名称:		矩阵行加法 rowLocal = rowLocal + rate *rowAddrowLocal:		矩阵行标,被加数rowAdd:			矩阵行标,加数rate:			加数前倍数*/Matrix& AddRow(int rowLocal, int rowAdd, double rate = 1.0);//矩阵加法 某列 + 倍数*某列/*函数名称:		矩阵列加法 colLocal = colLocal + rate * colAddcolLocal:		矩阵列标,被加数colAdd:			矩阵列标,加数rate:			加数前倍数*/Matrix& AddCol(int colLocal, int colAdd, double rate = 1.0);//*******************矩阵加法*****************///*函数名称:		矩阵加法 本矩阵 = 本矩阵 + mat 前提是两个矩阵维度一致mat:			加数矩阵*/Matrix& AddMat(Matrix& mat);//*******************矩阵乘法*****************///*函数名称:		矩阵乘法 本矩阵 = 本矩阵*num num:			矩阵乘数*/Matrix& MultNum(double num);/*函数名称:		矩阵乘法(运算符重载) 本矩阵 = 本矩阵*num num:			矩阵乘数*/Matrix& operator * (double num);/*函数名称:		矩阵某行乘数值row = row*numnum:			矩阵某列乘数row:			矩阵行标*/Matrix& MultRow(double num, int row);/*函数名称:		矩阵某列乘数值col = col *numnum:			矩阵某列乘数col:			矩阵列标*/Matrix& MultCol(double num, int col);/*函数名称:		矩阵乘法,按照矩阵相乘规则inputMat:		乘数矩阵*/Matrix& MultMat(Matrix& inputMat);//******************行列式相关操作***********************///*函数名称:		求解矩阵对应行列式数值,前提为方阵,按照定义求解,时间复杂度为O(n!*n),一般不用此方法求解*/double Det();/*函数名称:		求解矩阵对应行列式的顺序主子式,前提为方阵,按照定义求解,时间复杂度为O(n!*n),一般不用此方法求解order:			阶数*/double Det(int order);/*函数名称:		矩阵行标为row、列标为col的余子式row:			矩阵行标col:			矩阵列标*/Matrix& ChildMatrix(int row, int col);/*函数名称:		通过高斯列主消元求解矩阵行列式数值,最为常用*/double DetRow();//*********************矩阵求逆********************///*函数名称:		矩阵求逆,按照定义求解,1/|A|*(A*),时间复杂度为O(n!*n),一般不用此方法*/Matrix& Inverse();/*函数名称:		矩阵求逆,通过行初等变化,高斯列主消元法求解*/Matrix& InverseRow();/*函数名称:		矩阵求逆,只针对于下三角矩阵进行求解*/Matrix& InverseDownTriangle();/*函数名称:		矩阵求逆,只针对于上三角矩阵进行求解*/Matrix& InverseUpTriangle();//矩阵LU分解/*函数名称:		矩阵LU分解LMat:			矩阵分解后的L矩阵UMat:			矩阵分解后的U矩阵*/void ResolveLU(Matrix& LMat, Matrix& UMat);/*函数名称:		矩阵的LUP分解 P*A = L*U 添加了列主消元功能LMat:			矩阵分解后的L矩阵UMat:			矩阵分解后的U矩阵PMat:			矩阵分解后的P矩阵*/void ResolveLUP(Matrix& LMat, Matrix& UMat, Matrix& PMat);private:double** m_Matrix;						//矩阵int m_Row;								//矩阵行数int m_Col;								//矩阵列数};#endif

Matrix.cpp实现文件:

#include "Matrix.h"//******************************构造函数与析构函数********************************//
Matrix::Matrix()
{}//初始化矩阵 默认值为0
Matrix::Matrix(int row, int col)
{this->m_Row = row;this->m_Col = col;//开辟内存this->m_Matrix = new double* [row];for (int i = 0; i < row; i++){this->m_Matrix[i] = new double[col] {0.0};}}//初始化矩阵 设定数值
Matrix::Matrix(int row, int col, double *mat)
{this->m_Row = row;this->m_Col = col;//开辟内存this->m_Matrix = new double* [row];for (int i = 0; i < row; i++){this->m_Matrix[i] = new double[col] {0.0};}//矩阵赋值for(int i = 0; i<row; i++){for (int j = 0; j < col; j++){this->m_Matrix[i][j] = mat[i * col + j];}}
}//深拷贝
Matrix::Matrix(const Matrix& mat)
{//行列传递this->m_Row = mat.m_Row;this->m_Col = mat.m_Col;//矩阵深拷贝this->m_Matrix = new double* [this->m_Row];for (int i = 0; i < this->m_Row; i++){this->m_Matrix[i] = new double[this->m_Col];memcpy(this->m_Matrix[i], mat.m_Matrix[i], sizeof(double) * this->m_Col);}
}Matrix::~Matrix()
{//释放矩阵每一行for (int i = 0; i < this->m_Row; i++){if (this->m_Matrix[i] != NULL){delete[]this->m_Matrix[i];this->m_Matrix[i] = NULL;}}//释放矩阵顶点if (this->m_Matrix != NULL){delete[]this->m_Matrix;this->m_Matrix = NULL;}
}
//获取矩阵某个元素 某行某列
double Matrix::GetMatrixEle(int row, int col)
{if (row >= this->m_Row){std::cout << "Error: <GetMatrixEle> Input row >= m_Row" << std::endl;return 0.0;}else if (col >= this->m_Col){std::cout << "Error: <GetMatrixEle> Input col >= m_Col" << std::endl;return 0.0;}else{return this->m_Matrix[row][col];}
}//*******************设置矩阵*****************//
void Matrix::SetMatrixEle(int row, int col, double value)
{if (row >= this->m_Row){std::cout << "Error: <SetMatrixEle> Input row >= m_Row" << std::endl;return;}else if (col >= this->m_Col){std::cout << "Error: <SetMatrixEle> Input col >= m_Col" << std::endl;return;}else{this->m_Matrix[row][col] = value;return;}
}Matrix Matrix::CopyMat(const Matrix mat)
{//行列传递this->m_Row = mat.m_Row;this->m_Col = mat.m_Col;//矩阵深拷贝this->m_Matrix = new double* [this->m_Row];for (int i = 0; i < this->m_Row; i++){this->m_Matrix[i] = new double[this->m_Col];memcpy(this->m_Matrix[i], mat.m_Matrix[i], sizeof(double) * this->m_Col);}return *this;
}//*******************打印矩阵*****************//
//矩阵输出
void Matrix::PrintMat()
{for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){std::cout.setf(std::ios::scientific);		//科学计数法表示std::cout << this->m_Matrix[i][j] << "\t";}std::cout << std::endl;}std::cout << std::endl;
}//*****************矩阵基本操作***************//
//矩阵转置
Matrix& Matrix::Transpose()
{Matrix* resMat = new Matrix(this->m_Col, this->m_Row);for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){resMat->m_Matrix[j][i] = this->m_Matrix[i][j];}}return *resMat;
}//求等长度单位矩阵
Matrix& Matrix::Uint()
{//矩阵是否为方阵if (this->m_Col != this->m_Row){std::cout << "Error: <Uint> Row != Col" << std::endl;Matrix* resMat = new Matrix(this->m_Row, this->m_Row);return *resMat;}else{//单位矩阵初始化Matrix* resMat = new Matrix(this->m_Row, this->m_Col);//单位矩阵生成for (int i = 0; i < this->m_Row; i++){resMat->m_Matrix[i][i] = 1.0;}return *resMat;}
}//****************矩阵保留与剔除**************//
//剔除矩阵的 index中的行与列,num代表index的大小
Matrix& Matrix::DeleteMat(int* index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row - num, this->m_Col - num);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}else if (index[i] >= this->m_Col){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num-1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[recIndex[iRow]][recIndex[iCol]];}}return *resMat;}Matrix& Matrix::DeleteMat(std::vector<int> index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row - num, this->m_Col - num);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}else if (index[i] >= this->m_Col){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[recIndex[iRow]][recIndex[iCol]];}}return *resMat;
}//剔除矩阵的 index中的行,num代表index的大小
Matrix& Matrix::DeleteRow(int* index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row - num, this->m_Col);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[recIndex[iRow]][iCol];}}return *resMat;
}Matrix& Matrix::DeleteRow(std::vector<int> index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row - num, this->m_Col);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[recIndex[iRow]][iCol];}}return *resMat;
}Matrix& Matrix::DeleteCol(int* index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row, this->m_Col - num);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[iRow][recIndex[iCol]];}}return *resMat;
}Matrix& Matrix::DeleteCol(std::vector<int> index, int num)
{//结果矩阵Matrix* resMat = new Matrix(this->m_Row, this->m_Col - num);int recIndex[MAX_COUNT];int currIndex = 0;//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <DeleteMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//筛选出剔除后行数for (int iRow = 0; iRow < this->m_Row; iRow++){for (int iNum = 0; iNum < num; iNum++){if (iRow == index[iNum]){break;}if (iNum == num - 1){recIndex[currIndex++] = iRow;}}}//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[iRow][iCol] = this->m_Matrix[iRow][recIndex[iCol]];}}return *resMat;
}//******************矩阵的替换****************//
//替换矩阵中的行和列 index中的行与列,num代表index的大小
Matrix& Matrix::ReplaceMat(int* index, int num, Matrix& mat)
{//错误判定 方阵if (this->m_Row != this->m_Col){std::cout << "Error: <ReplaceMat> this m_Col != m_Row" << std::endl;return *this;}//检验插入矩阵为方阵if (mat.m_Row != mat.m_Col){std::cout << "Error: <ReplaceMat> mat m_Col != m_Row" << std::endl;return *this;}//检验插入矩阵大小与num保持一致if (mat.m_Col != num){std::cout << "Error: <ReplaceMat> num != mat.m_Col" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <ReplaceMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}else if (index[i] >= this->m_Col){std::cout << "Error: <ReplaceMat> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < num; iRow++){for (int iCol = 0; iCol < num; iCol++){resMat->m_Matrix[index[iRow]][index[iCol]] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}Matrix& Matrix::ReplaceMat(std::vector<int> index, int num, Matrix& mat)
{//错误判定 方阵if (this->m_Row != this->m_Col){std::cout << "Error: <ReplaceMat> this m_Col != m_Row" << std::endl;return *this;}//检验插入矩阵为方阵if (mat.m_Row != mat.m_Col){std::cout << "Error: <ReplaceMat> mat m_Col != m_Row" << std::endl;return *this;}//检验插入矩阵大小与num保持一致if (mat.m_Col != num){std::cout << "Error: <ReplaceMat> num != mat.m_Col" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <ReplaceMat> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}else if (index[i] >= this->m_Col){std::cout << "Error: <ReplaceMat> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < num; iRow++){for (int iCol = 0; iCol < num; iCol++){resMat->m_Matrix[index[iRow]][index[iCol]] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}//替换矩阵中的行 index中的行,num代表index的大小, mat是需要替换的矩阵
Matrix& Matrix::ReplaceRow(int* index, int num, Matrix& mat)
{//检验插入矩阵大小与num保持一致if (mat.m_Row != num){std::cout << "Error: <ReplaceRow> num != mat.m_Row" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <ReplaceRow> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//当前矩阵列数应与mat列数一致if (this->m_Col != mat.m_Col){std::cout << "Error: <ReplaceRow> this->m_Col != mat.m_Col" << std::endl;return *this;}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < num; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[index[iRow]][iCol] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}Matrix& Matrix::ReplaceRow(std::vector<int> index, int num, Matrix& mat)
{//检验插入矩阵大小与num保持一致if (mat.m_Row != num){std::cout << "Error: <ReplaceRow> num != mat.m_Row" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Row){std::cout << "Error: <ReplaceRow> Input index[" << i << "] = " << index[i] << " >= m_Row" << std::endl;return *this;}}//当前矩阵列数应与mat列数一致if (this->m_Col != mat.m_Col){std::cout << "Error: <ReplaceRow> this->m_Col != mat.m_Col" << std::endl;return *this;}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < num; iRow++){for (int iCol = 0; iCol < resMat->m_Col; iCol++){resMat->m_Matrix[index[iRow]][iCol] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}//替换矩阵中的列 index中的列,num代表index的大小, mat是需要替换的矩阵
Matrix& Matrix::ReplaceCol(int* index, int num, Matrix& mat)
{//检验插入矩阵大小与num保持一致if (mat.m_Col != num){std::cout << "Error: <ReplaceCol> mat.m_Col != num" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Col){std::cout << "Error: <ReplaceCol> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//当前矩阵行数应与mat行数一致if (this->m_Row != mat.m_Row){std::cout << "Error: <ReplaceCol> this->m_Row != mat.m_Row" << std::endl;return *this;}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < num; iCol++){resMat->m_Matrix[iRow][index[iCol]] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}Matrix& Matrix::ReplaceCol(std::vector<int> index, int num, Matrix& mat)
{//检验插入矩阵大小与num保持一致if (mat.m_Col != num){std::cout << "Error: <ReplaceCol> mat.m_Col != num" << std::endl;return *this;}//检验数据有效性for (int i = 0; i < num; i++){//越界判定if (index[i] >= this->m_Col){std::cout << "Error: <ReplaceCol> Input index[" << i << "] = " << index[i] << " >= m_Col" << std::endl;return *this;}}//当前矩阵行数应与mat行数一致if (this->m_Row != mat.m_Row){std::cout << "Error: <ReplaceCol> this->m_Row != mat.m_Row" << std::endl;return *this;}//结果矩阵Matrix* resMat = new Matrix(*this);//加入元素for (int iRow = 0; iRow < resMat->m_Row; iRow++){for (int iCol = 0; iCol < num; iCol++){resMat->m_Matrix[iRow][index[iCol]] = mat.m_Matrix[iRow][iCol];}}return *resMat;
}//*****************矩阵初等变化***************//
Matrix& Matrix::SwapRow(int row0, int row1)
{//错误判定 越界if ((this->m_Row <= row0) || (this->m_Col <= row1)){std::cout << "Error: <SwapRow> Input row0 Or row1 More Than m_Row" << std::endl;return *this;}else if ((0 > row0) || (0 > row1)){std::cout << "Error: <SwapRow> Input row0 Or row1 Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//中转临时变量double temp = 0.0;for (int j = 0; j < resMat->m_Col; j++){temp = resMat->m_Matrix[row0][j];resMat->m_Matrix[row0][j] = resMat->m_Matrix[row1][j];resMat->m_Matrix[row1][j] = temp;}return*resMat;}
}Matrix& Matrix::SwapCol(int col0, int col1)
{//错误判定 越界if ((this->m_Col <= col0) || (this->m_Col <= col1)){std::cout << "Error: <SwapCol> Input col0 Or col1 More Than m_Col" << std::endl;return *this;}else if ((0 > col0) || (0 > col1)){std::cout << "Error: <SwapCol> Input col0 Or col1 Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//中转临时变量double temp = 0.0;for (int i = 0; i < resMat->m_Row; i++){temp = resMat->m_Matrix[i][col0];resMat->m_Matrix[i][col0] = resMat->m_Matrix[i][col1];resMat->m_Matrix[i][col1] = temp;}return*resMat;}
}//矩阵加法 某行 + 倍数*某行
Matrix& Matrix::AddRow(int rowLocal, int rowAdd, double rate)
{if ((this->m_Row <= rowLocal) || (this->m_Row <= rowAdd)){std::cout << "Error: <AddRow> Input rowLocal Or rowAdd More Than m_Row" << std::endl;return *this;}else if ((0 > rowLocal) || (0 > rowAdd)){std::cout << "Error: <AddRow> Input rowLocal Or rowAdd Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//指定行相加for (int j = 0; j < resMat->m_Col; j++){resMat->m_Matrix[rowLocal][j] += rate * resMat->m_Matrix[rowAdd][j];}return *resMat;}
}//矩阵加法 某列 + 倍数*某列
Matrix& Matrix::AddCol(int colLocal, int colAdd, double rate)
{if ((this->m_Col <= colLocal) || (this->m_Col <= colAdd)){std::cout << "Error: <AddCol> Input colLocal Or colAdd More Than m_Col" << std::endl;return *this;}else if ((0 > colLocal) || (0 > colAdd)){std::cout << "Error: <AddCol> Input colLocal Or colAdd Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//指定列相加for (int i = 0; i < resMat->m_Row; i++){resMat->m_Matrix[i][colLocal] += rate * resMat->m_Matrix[i][colAdd];}return *resMat;}
}//*******************矩阵加法*****************//
Matrix& Matrix::AddMat(Matrix& mat)
{Matrix* ResMat = new Matrix(*this);for (int i = 0; i < ResMat->m_Row; i++){for (int j = 0; j < ResMat->m_Col; j++){ResMat->m_Matrix[i][j] += mat.m_Matrix[i][j];}}return *ResMat;
}//*******************矩阵乘法*****************//
//矩阵数乘
Matrix& Matrix::MultNum(double num)
{//结果矩阵初始化Matrix* resMat = new Matrix(this->m_Row, this->m_Col);//乘后矩阵生成for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){resMat->m_Matrix[i][j] = num * this->m_Matrix[i][j];}}return *resMat;
}//运算符重载 矩阵数乘
Matrix& Matrix::operator*(double num)
{//结果矩阵初始化Matrix* resMat = new Matrix(this->m_Row, this->m_Col);//乘后矩阵生成for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){resMat->m_Matrix[i][j] = num * this->m_Matrix[i][j];}}return *resMat;
}//矩阵某行乘数值 行标从0开始计数
Matrix& Matrix::MultRow(double num, int row)
{if (this->m_Row <= row){std::cout << "Error: <MultRow> Input row More Than m_Row" << std::endl;return *this;}else if (0 > row){std::cout << "Error: <MultRow> Input row Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//乘后矩阵生成for (int j = 0; j < this->m_Col; j++){resMat->m_Matrix[row][j] = num * this->m_Matrix[row][j];}return *resMat;}}//矩阵某列乘数值 列标从0开始计数
Matrix& Matrix::MultCol(double num, int col)
{if (this->m_Col <= col){std::cout << "Error: <MultCol> Input col More Than m_Row" << std::endl;return *this;}else if (0 > col){std::cout << "Error: <MultCol> Input col Less 0" << std::endl;return *this;}else{//结果矩阵初始化Matrix* resMat = new Matrix(*this);//乘后矩阵生成for (int i = 0; i < this->m_Row; i++){resMat->m_Matrix[i][col] = num * this->m_Matrix[i][col];}return *resMat;}
}//矩阵相乘
Matrix& Matrix::MultMat(Matrix& inputMat)
{Matrix *resMat = new Matrix(this->m_Row, inputMat.m_Col);if (this->m_Col != inputMat.m_Row){std::cout << "Matrix Mult Error!" << std::endl;return *resMat;}else{for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < inputMat.m_Col; j++){for (int k = 0; k < this->m_Col; k++){resMat->m_Matrix[i][j] += this->m_Matrix[i][k] * inputMat.m_Matrix[k][j];}}}return *resMat;}
}//矩阵的行列式数值
double Matrix::Det()
{double res = 0.0;int sign = 1;if (this->m_Row != this->m_Col){//错误判定std::cout << "Error: <Det> Matrix Col != Row" << std::endl;return 0;}else if (this->m_Row <= 1){//程序终止出口return this->m_Matrix[0][0];}else{for (int i = 0; i < this->m_Col; i++){Matrix* temp = &(this->ChildMatrix(0, i));res += sign * this->m_Matrix[0][i] * (temp->Det());sign = -1*sign;delete temp;}}}//矩阵行列式顺序主子式 order阶数
double Matrix::Det(int order)
{if (this->m_Row != this->m_Col){//错误判定std::cout << "Error: <Det> Matrix Col != Row" << std::endl;return 0;}else if (order < 0){std::cout << "Error: <Det>  Input Order Less 0" << std::endl;return 0;}else if (order >= this->m_Row){std::cout << "Error: <Det> Input Order More Than Row" << std::endl;return 0;}else{Matrix tempMat(order + 1, order + 1);for (int i = 0; i < tempMat.m_Col; i++){for (int j = 0; j < tempMat.m_Row; j++){tempMat.m_Matrix[i][j] = this->m_Matrix[i][j];}}return tempMat.Det();}
}//求解余子式
Matrix& Matrix::ChildMatrix(int row, int col)
{if (this->m_Row != this->m_Col){std::cout << "Error: <ChildMatrix> Matrix row != col" << std::endl;return *this;}else if (this->m_Row <= 1){std::cout << "Error: <ChildMatrix> Matrix Row Less 1 " << std::endl;return *this;}else if ((row > this->m_Row) || (col > this->m_Col)){std::cout << "Error: <ChildMatrix> Input Row Or Col More Than Matix Max Row Or Col" << std::endl; return* this; }else{Matrix* resMat = new Matrix(this->m_Row-1, this->m_Col-1);for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){if ((i < row) && (j < col))resMat->m_Matrix[i][j] = this->m_Matrix[i][j];else if((i > row) && (j < col))resMat->m_Matrix[i-1][j] = this->m_Matrix[i][j];else if((i < row) && (j > col))resMat->m_Matrix[i][j - 1] = this->m_Matrix[i][j];else if((i > row) && (j > col))resMat->m_Matrix[i - 1][j - 1] = this->m_Matrix[i][j];}}return *resMat;}
}//列主消元处理为上三角矩阵
double Matrix::DetRow()
{//交换标志位 1代表偶数次交换 -1代表奇数次交换int flagShift = 1;//本矩阵Matrix *localMat = new Matrix(*this);//行列式数值double resDet = 1.0;//*******************通过交换 num1*i + num2*j 实现下三角为0***************//for (int i = 0; i < localMat->m_Row - 1; i++){//记录最大行所在行标int tempMaxRow = i;for (int i1 = i + 1; i1 < localMat->m_Row; i1++){if (abs(localMat->m_Matrix[i1][i]) > abs(localMat->m_Matrix[tempMaxRow][i])){tempMaxRow = i1;}}if (tempMaxRow != i){//std::cout << i << " 行交换" << tempMaxRow << " 行" << std::endl;//进行交换 将当前第i行与第tempMaxRow行进行互换 初等行变换*localMat = localMat->SwapRow(i, tempMaxRow);//记录交换次数flagShift = -flagShift;//localMat->PrintMat();}//此对角线以下的元素通过初等变化为0for (int i2 = i + 1; i2 < localMat->m_Row; i2++){if (localMat->m_Matrix[i2][i] != 0){//std::cout << "<" << localMat->m_Matrix[i][i] << "> *" << i2 << " 行 + <" << -1.0 * (localMat->m_Matrix[i2][i]) << "> *" << i << " 行" << std::endl;*localMat = localMat->AddRow(i2, i, -1.0 * (localMat->m_Matrix[i2][i]) / localMat->m_Matrix[i][i]);//localMat->PrintMat();}}}//计算行列式数值 对角线相乘for (int i = 0; i < localMat->m_Row; i++){resDet = resDet * localMat->m_Matrix[i][i];}//矩阵交换一次就会变号resDet = flagShift * resDet;//清理localMatrixdelete localMat;return resDet;
}//矩阵求逆
Matrix& Matrix::Inverse()
{if (abs(this->DetRow()) < MIN_DET){std::cout << "Error: <Inverse> Matrix Det Near 0" << std::endl;return *this;}else{Matrix* resMat = new Matrix(this->m_Row, this->m_Col);for (int i = 0; i < this->m_Row; i++){for (int j = 0; j < this->m_Col; j++){Matrix* temp = &(this->ChildMatrix(j, i));resMat->m_Matrix[i][j] = pow(-1.0, (i + j)) / this->DetRow() * (temp->DetRow());delete temp;}}return *resMat;}
}//矩阵求逆 行初等变化
Matrix& Matrix::InverseRow()
{//错误判断if (abs(this->DetRow()) < MIN_DET){std::cout << "Error: <InverseRow> Matrix Det Near 0" << std::endl;return *this;}else if (this->m_Row <= 1){std::cout << "Error: <InverseRow> Size Less 2" << std::endl;return *this;}else{//单位矩阵 与带转换矩阵维度相同的Matrix uint = this->Uint();//结果矩阵 逆矩阵 初始状态与本矩阵相同 为不使本矩阵发生改变Matrix temp(this->m_Row, this->m_Col);Matrix* resMat = new Matrix(temp.Uint());//本矩阵Matrix localMat(*this);//*******************通过交换 num1*i + num2*j 实现下三角为0***************//for (int i = 0; i < localMat.m_Row - 1; i++){//记录最大行所在行标int tempMaxRow = i;for (int i1 = i + 1; i1 < localMat.m_Row; i1++){if (abs(localMat.m_Matrix[i1][i]) > abs(localMat.m_Matrix[tempMaxRow][i])){tempMaxRow = i1;}}if (tempMaxRow != i){//std::cout << i << " 行交换" << tempMaxRow << " 行" << std::endl;//进行交换 将当前第i行与第tempMaxRow行进行互换 初等行变换localMat = localMat.SwapRow(i, tempMaxRow);*resMat = resMat->SwapRow(i, tempMaxRow);//localMat.PrintMat();}//此对角线以下的元素通过初等变化为0for (int i2 = i + 1; i2 < localMat.m_Row; i2++){if (localMat.m_Matrix[i2][i] != 0){//std::cout << "<" << localMat.m_Matrix[i][i] << "> *" << i2 << " 行 + <" << -1.0 * (localMat.m_Matrix[i2][i]) << "> *" << i << " 行" << std::endl;*resMat = resMat->AddRow(i2, i, -1.0 * (localMat.m_Matrix[i2][i]) / localMat.m_Matrix[i][i]);localMat = localMat.AddRow(i2, i, -1.0 * (localMat.m_Matrix[i2][i]) / localMat.m_Matrix[i][i]);//localMat.PrintMat();}}}//错误判断if (localMat.m_Matrix[localMat.m_Row - 1][localMat.m_Col - 1] == 0){std::cout << "Error: <InverseRow> marix[" << localMat.m_Row - 1 << "][" << localMat.m_Col - 1 <<"] == 0" << std::endl;return *this;}//*******************通过 num1*i + num2*j 实现上三角为0***************//for (int i = localMat.m_Row - 1; i > 0; i--){for (int i2 = i - 1; i2 >= 0; i2--){if (localMat.m_Matrix[i2][i] != 0){//std::cout << "<" << localMat.m_Matrix[i][i] << "> *" << i2 << " 行 + <" << -1.0 * (localMat.m_Matrix[i2][i]) << "> *" << i << " 行" << std::endl;*resMat = resMat->AddRow(i2, i, -1.0 * (localMat.m_Matrix[i2][i]) / localMat.m_Matrix[i][i]);localMat = localMat.AddRow(i2, i, -1.0 * (localMat.m_Matrix[i2][i]) / localMat.m_Matrix[i][i]);//localMat.PrintMat();}}}//*******************通过 i*num 实现矩阵为单位矩阵***************//for (int i = 0; i < localMat.m_Row; i++){if (localMat.m_Matrix[i][i] == 0){std::cout << "Error: <InverseRow> matrix[" << i << "]" << "[" << i << "] == 0" << std::endl;return *this;}else{//std::cout << "<" << 1 / localMat.m_Matrix[i][i] << "> *" << i << " 行" << std::endl;*resMat = resMat->MultRow(1 / localMat.m_Matrix[i][i], i);localMat = localMat.MultRow(1 / localMat.m_Matrix[i][i], i);//localMat.PrintMat();}}return *resMat;}
}//矩阵求逆 下三角矩阵
Matrix& Matrix::InverseDownTriangle()
{//错误判断 方阵检测if (this->m_Row != this->m_Col){std::cout << "Error: <InverseDownTriangle> Matrix Col != Row" << std::endl;return *this;}//下三角求逆Matrix* resMat = new Matrix(*this);for (int i = 0; i < resMat->m_Row; i++){for (int j = 0; j <= i; j++){//分段求解 对角线为倒数if (i == j){resMat->m_Matrix[i][j] = 1 / resMat->m_Matrix[i][j];}else{//分段求解 非对角线元素 double tempSum = 0.0;for (int k = j; k <= i - 1; k++){tempSum += resMat->m_Matrix[i][k] * resMat->m_Matrix[k][j];}resMat->m_Matrix[i][j] = -1.0*tempSum / resMat->m_Matrix[i][i];}}}return *resMat;}//矩阵求逆 上三角矩阵
Matrix& Matrix::InverseUpTriangle()
{//错误判断 方阵检测if (this->m_Row != this->m_Col){std::cout << "Error: <InverseUpTriangle> Matrix Col != Row" << std::endl;return *this;}//上三角求逆Matrix* resMat = new Matrix(*this);for (int j = resMat->m_Col-1; j >=0; j--){for (int i = j; i >=0; i--){//分段求解 对角线为倒数if (i == j){resMat->m_Matrix[i][j] = 1 / resMat->m_Matrix[i][j];}else{//分段求解 非对角线元素 double tempSum = 0.0;for (int k = j; k >= i+1; k--){tempSum += resMat->m_Matrix[i][k] * resMat->m_Matrix[k][j];}resMat->m_Matrix[i][j] = -1.0 * tempSum / resMat->m_Matrix[i][i];}}}return *resMat;
}//矩阵LU分解 顺序分解 对于病态矩阵可能存在精度问题
void Matrix::ResolveLU(Matrix& LMat, Matrix& UMat)
{if (this->m_Col != this->m_Row){std::cout << "Error: <ResolveLU> Is Not Square Matrix" << std::endl;return;}//存在性判定 顺序主子式不为0for (int i = 0; i < this->m_Row; i++){if (this->Det(i) == 0){std::cout << "Error: <ResolveLU> order Det = 0" << std::endl;return;}}//LU 分解//L矩阵为单位矩阵LMat = this->Uint();//U矩阵初始化为空矩阵Matrix temp(this->m_Row, this->m_Col);UMat = temp;for (int i = 0; i < this->m_Row; i++){//计算Ufor (int j1 = i; j1 < this->m_Col; j1++){double tempSum1 = 0.0;if (i != 0){for (int j2 = 0; j2 <= i - 1; j2++){tempSum1 += LMat.m_Matrix[i][j2] * UMat.m_Matrix[j2][j1];}}UMat.m_Matrix[i][j1] = this->m_Matrix[i][j1] - tempSum1;}//计算Lfor (int i1 = i; i1 < this->m_Row; i1++){double tempSum2 = 0.0;if (i != 0){for (int j2 = 0; j2 <= i - 1; j2++){tempSum2 += LMat.m_Matrix[i1][j2] * UMat.m_Matrix[j2][i];}}LMat.m_Matrix[i1][i] = (this->m_Matrix[i1][i] - tempSum2)/UMat.m_Matrix[i][i];}}}//矩阵的LUP分解 P*A = L*U 添加了列主消元功能 
//L为主对角线元素为1的下三角矩阵 U为上二角矩阵 P为行交换矩阵 P*A=L*U
void Matrix::ResolveLUP(Matrix& LMat, Matrix& UMat, Matrix& PMat)
{//条件判断 矩阵行列式不为0if (this->Det() == 0){std::cout << "Error: <ResolveLUP> Can't Resolve Matrix To L U P" << std::endl;return;}//初始化 L U PLMat = this->Uint();PMat = this->Uint();UMat = *this;//进行分解计算for (int i = 0; i < UMat.m_Row - 1; i++){//记录最大行所在行标int tempMaxRow = i;for (int i1 = i + 1; i1 < UMat.m_Row; i1++){if (abs(UMat.m_Matrix[i1][i]) > abs(UMat.m_Matrix[tempMaxRow][i])){tempMaxRow = i1;}}//进行交换 将当前第i行与第tempMaxRow行进行互换 初等行变换UMat = UMat.SwapRow(i, tempMaxRow);//L矩阵做出对应交换 先交换<itempMaxRow>列再交换<itempMaxRow>行LMat = LMat.SwapCol(i, tempMaxRow);LMat = LMat.SwapRow(i, tempMaxRow);//P矩阵做出对应变换 交换<itempMaxRow>行PMat = PMat.SwapRow(i, tempMaxRow);//高斯消元 V矩阵消除下三角区域,L矩阵添加下三角区域for (int i1 = i + 1; i1 < UMat.m_Row; i1++){//记录消元系数double deleteVar = UMat.m_Matrix[i1][i] / UMat.m_Matrix[i][i];//L矩阵列填充LMat.m_Matrix[i1][i] = deleteVar;//U矩阵列消除UMat = UMat.MultRow(UMat.m_Matrix[i][i], i1).AddRow(i1, i, -1.0 * UMat.m_Matrix[i1][i]).MultRow(1 / UMat.m_Matrix[i][i], i1);}}return;
}

相关文章:

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元&#xff0c;干翻Ansys的目标”&#xff0c;基本框架为前端显示使用QT实现交互&#xff0c;后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…...

【GORM】初探gorm模型,字段标签与go案例

GORM是什么&#xff1f; GORM 是一个Go 语言 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它让我们可以使用结构体来操作数据库&#xff0c;而无需编写SQL 语句 GORM 模型与字段标签详解 在 GORM 中&#xff0c;模型是数据库表的抽象表示&#xff0c;字段标签&am…...

html全局遮罩,通过websocket来实现实时发布公告

1.index.html代码示例 <div id"websocket" style"display:none;position: absolute;color:red;background-color: black;width: 100%;height: 100%;z-index: 100; opacity: 0.9; padding-top: 30%;padding-left: 30%; padding-border:1px; "onclick&q…...

基于VSCode+CMake+debootstrap搭建Ubuntu交叉编译开发环境

基于VSCodeCMakedebootstrap搭建Ubuntu交叉编译开发环境 1 基于debootstrap搭建目标系统环境1.1 安装必要软件包1.2 创建sysroot目录1.3 运行debootstrap1.4 挂载必要的虚拟文件系统1.5 复制 QEMU 静态二进制文件1.6 进入目标系统1.7 使用目标系统&#xff08;以安装zlog为例&a…...

C#中System.Text.Json:从入门到精通的实用指南

一、引言 在当今数字化时代&#xff0c;数据的高效交换与处理成为软件开发的核心环节。JSON&#xff08;JavaScript Object Notation&#xff09;凭借其简洁、轻量且易于读写的特性&#xff0c;已然成为数据交换领域的中流砥柱。无论是前后端数据交互&#xff0c;还是配置文件…...

【深度学习】Huber Loss详解

文章目录 1. Huber Loss 原理详解2. Pytorch 代码详解3.与 MSELoss、MAELoss 区别及各自优缺点3.1 MSELoss 均方误差损失3.2 MAELoss 平均绝对误差损失3.3 Huber Loss 4. 总结4.1 优化平滑4.2 梯度较好4.3 为什么说 MSE 是平滑的 1. Huber Loss 原理详解 Huber Loss 是一种结合…...

Maven下载配置

目录 Win下载配置maven的环境变量 Mac下载安装配置环境变量 MavenSetting.xml文件配置 Win 下载 https://maven.apache.org/ 在主页面点击Download 点击archives 最好不要下载使用新版本&#xff0c;我使用的是maven-3.6.3&#xff0c;我们点击页面下方的archives&#xff0…...

JS基础(5):运算符和语句

一.运算符 1.赋值运算符 加减乘除都是一样的&#xff0c;&#xff0c;-&#xff0c;*&#xff0c;/ 2.一元运算符&#xff1a;经常用来计数 自增&#xff1a; 每次只能加一 自减&#xff1a;-- 前置自增 后置自增 结…...

游戏引擎学习第81天

仓库:https://gitee.com/mrxiao_com/2d_game_2 或许我们应该尝试在地面上添加一些绘图 在这段时间的工作中&#xff0c;讨论了如何改进地面渲染的问题。虽然之前并没有专注于渲染部分&#xff0c;因为当时主要的工作重心不在这里&#xff0c;但在实现过程中&#xff0c;发现地…...

网络安全 | 什么是正向代理和反向代理?

关注&#xff1a;CodingTechWork 引言 在现代网络架构中&#xff0c;代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介&#xff0c;帮助管理、保护和优化数据流。根据代理的工作方向和用途&#xff0c;代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…...

前缀和——模板 二维前缀和

一.题目描述 【模板】二维前缀和_牛客题霸_牛客网 二.题目解析 这道题和上一道题有点异曲同工之妙。输入一个m行n列的矩阵&#xff0c;然后进行q次操作&#xff0c;每次操作输入4个数&#xff0c;作为两个点的坐标&#xff0c;计算这两个点为对角线的矩阵的和。 三.算法原理 …...

oracle使用case when报错ORA-12704字符集不匹配原因分析及解决方法

问题概述 使用oracle的case when函数时&#xff0c;报错提示ORA-12704字符集不匹配&#xff0c;如下图&#xff0c;接下来分析报错原因并提出解决方法。 样例演示 现在有一个TESTTABLE表&#xff0c;本表包含的字段如下图所示&#xff0c;COL01字段是NVARCHAR2类型&#xff0…...

高等数学学习笔记 ☞ 定积分与积分公式

1. 定积分的基本概念 1.1 定积分的定义 1. 定义&#xff1a;设函数在闭区间上有界。在闭区间上任意插入若干个分点&#xff0c;即&#xff0c; 此时每个小区间的长度记作(不一定是等分的)。然后在每个小区间上任意取&#xff0c;对应的函数值为。 为保证每段的值(即矩形面积)无…...

MLMs之Agent:Phidata的简介、安装和使用方法、案例应用之详细攻略

MLMs之Agent&#xff1a;Phidata的简介、安装和使用方法、案例应用之详细攻略 目录 Phidata简介 Phidata安装和使用方法 1、安装 2、使用方法 (1)、认证 (2)、创建 Agent (3)、运行 Agent (4)、Agent Playground Phidata 案例应用 1、多工具 Agent 2、多模态 Agent …...

如何在不暴露MinIO地址的情况下,用Spring Boot与KKFileView实现文件预览

在现代Web应用中&#xff0c;文件预览是一项常见且重要的功能。它允许用户在不上传或下载文件的情况下&#xff0c;直接在浏览器中查看文件内容。然而&#xff0c;直接将文件存储服务&#xff08;如MinIO&#xff09;暴露给前端可能会带来安全风险。本文将介绍如何在不暴露MinI…...

ESP8266固件烧录

一、烧录原理 1、引脚布局 2、引脚定义 3、尺寸封装 4、环境要求 5、接线方式 ESP8266系列模块集成了高速GPI0和外围接口&#xff0c;这可能会导致严重的开关噪声。如果某些应用需要高功率和EMI特性&#xff0c;建议在数字I/0线上串联10到100欧姆。这可以在切换电源时抑制过冲…...

Python 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…...

三天急速通关Java基础知识:Day1 基本语法

三天急速通关JAVA基础知识&#xff1a;Day1 基本语法 0 文章说明1 关键字 Keywords2 注释 Comments2.1 单行注释2.2 多行注释2.3 文档注释 3 数据类型 Data Types3.1 基本数据类型3.2 引用数据类型 4 变量与常量 Variables and Constant5 运算符 Operators6 字符串 String7 输入…...

免费使用 Adobe 和 JetBrains 软件的秘密

今天想和大家聊聊如何利用 Edu 教育邮箱免费使用 Photoshop、Illustrator 等 Adobe 系列软件&#xff0c;以及 JetBrains 开发工具。 首先&#xff0c;Adobe 的软件是设计师的必备工具。无论是处理图像的 Photoshop&#xff0c;还是进行矢量设计的 Illustrator&#xff0c;它们…...

Pytorch 自学笔记(三):利用自定义文本数据集构建Dataset和DataLoader

Pytorch 自学笔记&#xff08;三&#xff09; 1. Dataset与DataLoader1.1 torch.utils.data.Dataset1.2 torch.utils.data.DataLoader Pytorch 自学笔记系列的第三篇。针对Pytorch的Dataset和DataLoader进行简单的介绍&#xff0c;同时&#xff0c;介绍如何使用自定义文本数据集…...

gradle项目的创建和基本结构简介

文章目录 创建gradle项目&#xff08;命令行&#xff09;创建gradle项目&#xff08;IDEA&#xff09;项目基本结构和功能Gradle 构建流程测试类体验 创建gradle项目&#xff08;命令行&#xff09; yangMacdeMac-mini gradleStudy % gradle init Starting a Gradle Daemon (s…...

wow-agent---Day3 Zigent 智能代理开发框架

这个框架是课程讲解的&#xff0c;但资料比较少&#xff0c;觉得框架比较小众&#xff0c;所以这里只分析代码&#xff0c;打算把更多的精力放在metagpt的学习上&#xff0c;毕竟还是要学教为主流的框架&#xff0c;这对后续维护升级都有帮助&#xff0c;当然感兴趣作为研究&am…...

python 入门

1. Python 概述 1.1 简介 python 是一种面向对象的解释型编程语言&#xff0c;由吉多范罗苏姆开发&#xff1b; 1991 年&#xff0c;公开发行版发布&#xff1b; 因其可以将其他语言制作的模块轻松联接在一起&#xff0c;又被称作胶水语言&#xff1b; 1.2 优点 简单易学&…...

sentinel微服务保护

学习链接 SpringCloudRabbitMQDockerRedis搜索分布式 文章目录 学习链接1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel官网地址github地址…...

接口测试Day10-封装IHRM登录

-登录接口 普通方式实现 登录接口对象层 思路&#xff1a; 动态变化的&#xff0c;写入参数固定不变&#xff0c;直接写到方法实现内响应结果&#xff0c;通过返回值 return 分析&#xff1a; 封装实现&#xff1a; 登录接口测试用例层 封装断言方法 1、创建 文件 assert_uti…...

什么是IP地址、子网掩码、网关、DNS

简单解释 IP地址在网络中用于标识一个节点(或者网络设备的接口) IP地址用于IP报文在网络中的寻址 一个IPv4地址有32 bit。 IPv4地址通常采用“点分十进制”表示。 IPv4地址范围:0.0.0.0~255.255.255.255 网络部分:用来标识一个网络&#xff0c;代表IP地址所属网络。 主机部分:…...

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测

角点检测&#xff08;Corner Detection&#xff09;是计算机视觉和图像处理中重要的步骤&#xff0c;主要用于提取图像中的关键特征&#xff0c;以便进行后续的任务&#xff0c;比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…...

软路由系统iStoreOS 一键安装 docker compose

一键安装命令 大家好&#xff01;今天我来分享一个快速安装 docker-compose 的方法。以下是我常用的命令&#xff0c;当前版本是 V2.32.4。如果你需要最新版本&#xff0c;可以查看获取docker compose最新版本号 部分&#xff0c;获取最新版本号后替换命令中的版本号即可。 w…...

Invicti-Professional-V25.1

01 更新介绍 此更新包括对内部代理的更改。内部扫描代理的当前版本为 25.1.0。内部身份验证验证程序代理的当前版本为 25.1.0。#新功能现在&#xff0c;单击扫描摘要屏幕中的预设扫描图标会将您重定向到具有过滤视图的 “最近扫描” 页面&#xff0c;从而改进导航和对相关扫描…...

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…...

Spring WebFlux

文章目录 一、概述1、Spring体系定位2、Spring MVC和WebFlux差异 二、入门1、依赖2、ReactorHttpHandlerAdapter&#xff08;main启动&#xff09;3、DispatcherHandler&#xff08;SpringWebFlux启动&#xff09;4、WebFilter 三、DispatcherHandler理解1、handle 前置知识&am…...

【AI | pytorch】torch.polar的使用

一、torch.polar的使用 torch.polar 是 PyTorch 中用来生成复数张量的一个函数&#xff0c;但它与数学中的复数表达式 ( z re^{i\theta} ) 是等价的。 具体来说&#xff0c;torch.polar(abs, angle) 接受两个实数张量参数&#xff1a; abs&#xff1a;表示复数的模长&#…...

AWTK fscript 中的 输入/出流 扩展函数

fscript 是 AWTK 内置的脚本引擎&#xff0c;开发者可以在 UI XML 文件中直接嵌入 fscript 脚本&#xff0c;提高开发效率。本文介绍一下 fscript 中的 iostream 扩展函数 1.iostream_get_istream 获取输入流对象。 原型 iostream_get_istream(iostream) > object示例 va…...

【多线程】线程池

一、什么是线程池 线程池&#xff08;Thread Pool&#xff09;是一种多线程并发执行的设计模式&#xff0c;它通过维护一个线程集合来执行多个任务&#xff0c;避免频繁地创建和销毁线程&#xff0c;提高系统性能和响应速度。 就好比如你经营了一家餐饮店&#xff0c;你名下有…...

小结:路由器配置和管理 RIP协议

华为路由器中配置和管理 RIP&#xff08;Routing Information Protocol&#xff09;的相关指令主要分为以下几个部分&#xff1a;基础配置指令、接口配置指令、路由控制指令和调试指令。以下是总结&#xff1a; 1. 启用 RIP 协议 [Huawei] rip 1rip 1&#xff1a;表示创建并启…...

基于海思soc的智能产品开发(高、中、低soc、以及和fpga的搭配)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 市场上关于图像、音频的soc其实非常多&#xff0c;这里面有高、中、低档&#xff0c;开发方式也不相同。之所以会这样&#xff0c;有价格的因素&am…...

于灵动的变量变幻间:函数与计算逻辑的浪漫交织(下)

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 这一节我们主要来学习单个函数的声明与定义&#xff0c;static和extern… 这里写目录标题 一、单个函数…...

偷偷的学Java

序章&#xff1a;为何要偷偷学Java&#xff1f; • Java&#xff0c;不仅仅是一种编程语言 • 偷偷学Java&#xff0c;快速提升你的竞争力 •Java学习秘籍 第一章&#xff1a;Java的神秘面纱 •Java的起源与发展历程 •Java的生态系统与应用场景 • Java与其他编程语言的…...

以单用户模式启动 Linux 的方法

注&#xff1a;本文为 “Linux 启动单用户模式” 相关文章合辑。 未整理去重。 以单用户模式启动 linux 的三种方法 作者&#xff1a; Magesh Maruthamuthu 译者&#xff1a; LCTT Xiaobin.Liu 2020-05-03 23:01 单用户模式&#xff0c;也被称为维护模式&#xff0c;超级用户…...

【AI论文】生成式视频模型是否通过观看视频学习物理原理?

摘要&#xff1a;AI视频生成领域正经历一场革命&#xff0c;其质量和真实感在迅速提升。这些进步引发了一场激烈的科学辩论&#xff1a;视频模型是否学习了能够发现物理定律的“世界模型”&#xff0c;或者&#xff0c;它们仅仅是复杂的像素预测器&#xff0c;能够在不理解现实…...

【有啥问啥】Contrastive Captioners(CoCa):对比式图像描述模型——图像-文本基础模型的新范式

Contrastive Captioners(CoCa)&#xff1a;对比式图像描述模型——图像-文本基础模型的新范式 引言 随着深度学习技术的发展&#xff0c;多模态模型在处理视觉和语言任务方面的能力逐渐增强。特别是大规模预训练模型的兴起&#xff0c;使得这些模型可以快速迁移到许多下游任务…...

Python(十七)excel指定列自动翻译成英文

前言 本章主要讲述在excel的指定列后面添加一列&#xff0c;并翻译成英文 一、效果图 二、代码 实际需求&#xff1a; # -*- codeing utf-8 -*- # time: 2025/1/16 16:32 # Author : Mikasa # # Aim&#xff1a;自动将客户发的货物清单里的商品名称&#xff0c;翻译成英文…...

【论文投稿】探秘计算机视觉算法:开启智能视觉新时代

目录 引言 一、计算机视觉算法基石&#xff1a;图像基础与预处理 二、特征提取&#xff1a;视觉信息的精华萃取 三、目标检测&#xff1a;从图像中精准定位目标 四、图像分类&#xff1a;识别图像所属类别 五、语义分割&#xff1a;理解图像的像素级语义 六、计算机视觉…...

【机器学习实战入门】使用LSTM机器学习预测股票价格

机器学习在股票价格预测中有重要的应用。在这个机器学习项目中&#xff0c;我们将讨论如何预测股票的收益。这是一个非常复杂的任务&#xff0c;充满了不确定性。我们将会把这个项目分成两部分进行开发&#xff1a; 首先&#xff0c;我们将学习如何使用 LSTM 神经网络预测股票…...

(一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)

一、四大坐标系介绍 1&#xff0c;世界坐标系 从这个世界&#xff08;world&#xff09;的视角来看物体 世界坐标系是3D空间坐标&#xff0c;每个点的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw​,Yw​,Zw​)表示 2&#xff0c;相机坐标系 相机本身具有一个坐标系&…...

Bootstrap 下拉菜单

Bootstrap 下拉菜单 Bootstrap 是一个流行的前端框架&#xff0c;它提供了许多预构建的组件&#xff0c;其中之一就是下拉菜单。下拉菜单是一个交互式元素&#xff0c;允许用户从一系列选项中选择一个。在本篇文章中&#xff0c;我们将详细介绍如何在 Bootstrap 中创建和使用下…...

WinHttp API接口辅助类实现GET POST网络通讯

1、简述 近期需要在MFC基础上开发网络Http通讯,开始使用的WinINet进行通讯,后面发现WinINet对连接超时这块不支持设置,在网上搜索了几种方式效果都不太好,于是决定用WinHttp API接口进行通讯,分别对GET、POST进行了封装。 2、使用到接口 2.1、WinHttpOpen WinHttpOpen 是…...

Elasticsearch实战应用

嘿&#xff0c;小伙伴们&#xff0c;今天咱们来唠唠Elasticsearch&#xff0c;这可是个超厉害的搜索引擎&#xff0c;能帮你在海量数据里快速找到想要的东西&#xff0c;就像给你的数据装上了“放大镜”。 一、啥是Elasticsearch 简单来说&#xff0c;Elasticsearch就是一个基…...

MySQL存储过程

存储过程: 事先经过编译并存储在数据库中的一段sql语句的集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&#xff0c;对于提高数据处理的效率是有好处的&#xff0c;思想上就是sql语言层面的代码封装与重用 …...

安路FPGA开发工具TD:问题解决办法 及 Tips 总结

安路科技&#xff08;Anlogic&#xff09;是一家专注于高性能、低功耗可编程逻辑器件&#xff08;FPGA&#xff09;设计和生产的公司。其提供的开发工具TD&#xff08;TangDynasty&#xff09;是专门为安路FPGA系列产品设计的集成开发环境&#xff08;IDE&#xff09;。以下是对…...