这个是.cpp文件
#include "matrix.h"
BigMatrix::BigMatrix(int iRow,int iColumn)
{
m_iRow = iRow;
m_iColumn = iColumn;
//现在定义一个 iRow X iColumn 大小的数组
m_f_pMatrix = new float *[iRow];
for(int i = 0;i < iRow;i ++)
m_f_pMatrix[i] = new float [iColumn];
for( i = 0;i < m_iRow;i ++)
{
for(int j = 0;j < m_iColumn;j ++)
{
m_f_pMatrix[i][j] = 0.0f;
}
}
//现在定义一个 iRow X iColumn 大小的数组
/*Matrix.resize(iRow);
for(int i = 0;i < iColumn;i ++)
Matrix[i].resize(iColumn);*/
}
BigMatrix::~BigMatrix(void)
{
for(int i = 0;i < m_iRow;i ++)
delete []m_f_pMatrix[i];
delete []m_f_pMatrix;
}
BigMatrix& BigMatrix::operator += (BigMatrix cM)
{
for(int i = 0;i <m_iRow;i ++)
{
for(int j = 0;j < m_iColumn;j ++)
{
m_f_pMatrix[i][j] += cM.m_f_pMatrix[i][j];
}
}
return *this;
}
BigMatrix& BigMatrix::operator -= (BigMatrix cM)
{
for(int i = 0;i <m_iRow;i ++)
{
for(int j = 0;j < m_iColumn;j ++)
{
m_f_pMatrix[i][j] -= cM.m_f_pMatrix[i][j];
}
}
return *this;
}
BigMatrix& BigMatrix::operator *= (float fMultiplicand)
{
for(int i = 0;i <m_iRow;i ++)
{
for(int j = 0;j < m_iColumn;j ++)
{
m_f_pMatrix[i][j] *= fMultiplicand;
}
}
return *this;
}
BigMatrix& BigMatrix::operator /= (float fMultiplicand)
{
for(int i = 0;i <m_iRow;i ++)
{
for(int j = 0;j < m_iColumn;j ++)
{
m_f_pMatrix[i][j] += fMultiplicand;
}
}
return *this;
}
BigMatrix* MatrixInverse(BigMatrix* pOut,const BigMatrix* pM)
{
float Pivot;
int iRow = pM->GetRow();//因为求逆时只能是方阵,只需行;
//建立一个ROW X ROW的单位矩阵,用来储存结果
float** f_pResult = new float* [iRow];
for(int i = 0;i <iRow;i ++)
f_pResult[i] = new float [iRow]; ;
//初始化单位矩阵;
for( i = 0;i < iRow;i ++)
{
for(int j = 0;j< iRow;j ++)
{
if(i == j)
f_pResult[i][j] = 1.0f;
else
f_pResult[i][j] = 0.0f;
}
}
//使主对角线的元为 1;
for( i = 0;i < iRow;i ++)
{
Pivot = pM->m_f_pMatrix[i][i];
if(Pivot != 1)
{
for(int k = 0;k < iRow;k ++)
{
pM->m_f_pMatrix[i][k] /= Pivot;
f_pResult[i][k] /= Pivot;
}
}
for(int j = 0;j < iRow;j ++)
{
//以 i 变量为列,遍历除 i 行的所有行 (因为是方阵,所以 主对角线的元的 行 和 列是一样的)
Pivot = pM->m_f_pMatrix[j][i];
if(Pivot != 0 && j != i)
{
for(int k = 0;k < iRow;k ++)
{
pM->m_f_pMatrix[j][k] = pM->m_f_pMatrix[j][k] - pM->m_f_pMatrix[i][k] * Pivot;
f_pResult[j][k] = f_pResult[j][k] - f_pResult[i][k] * Pivot;
}
}
}
}
for(i =0;i < iRow;i ++)
{
for(int j = 0;j < iRow;j ++)
{
pOut->m_f_pMatrix[i][j] = f_pResult[i][j];
}
}
for( i = 0;i < iRow;i ++)
delete []f_pResult[i];
delete []f_pResult;
return pOut;
}
BigMatrix* MatrixTranspose(BigMatrix* pOut,const BigMatrix* pM)
{
float **f_pTemp = new float *[pM->GetColumn()];
for(int i = 0;i <pM->GetColumn();i ++)
f_pTemp[i] = new float [pM->GetRow()];
for( i = 0;i <pM->GetRow();i ++)
{
for(int j = 0;j < pM->GetColumn();j ++)
{
f_pTemp[j][i] = pM->m_f_pMatrix[i][j];
}
}
for( i = 0;i <pM->GetRow();i ++)
{
for(int j = 0;j < pM->GetColumn();j ++)
{
pOut->m_f_pMatrix[i][j] = f_pTemp[i][j];
}
}
return pOut;
}
BigMatrix *MatrixAdd(BigMatrix *pOut,const BigMatrix *pM1,const BigMatrix *pM2)
{
for(int i = 0;i < pM1->GetRow();i ++)
{
for(int j = 0;j < pM1->GetColumn();j ++)
{
pOut->m_f_pMatrix[i][j] = pM1->m_f_pMatrix[i][j] + pM2->m_f_pMatrix[i][j];
}
}
return pOut;
}
BigMatrix *MatrixSubtract(BigMatrix *pOut,const BigMatrix *pM1,const BigMatrix *pM2)
{
for(int i = 0;i < pM1->GetRow();i ++)
{
for(int j = 0;j < pM1->GetColumn();j ++)
{
pOut->m_f_pMatrix[i][j] = pM1->m_f_pMatrix[i][j] - pM2->m_f_pMatrix[i][j];
}
}
return pOut;
}
BigMatrix *MatrixMultiply(BigMatrix *pOut,const BigMatrix *pM1,const BigMatrix *pM2)
{
for(int i = 0;i < pM1->GetRow();i ++)
{
for(int j = 0;j < pM2->GetColumn();j ++)
{
for(int k = 0;k <pM1->GetColumn();k ++)
{
pOut->m_f_pMatrix[i][j] += pM1->m_f_pMatrix[i][k] * pM2->m_f_pMatrix[k][j];
}
}
}
return pOut;
}