不是我写的,仅分享学习!书上配套,如有侵权,速删
与测绘程序设计配套(C++) 矩阵类 ,这个类鲁棒性不好
矩阵运算类我更推荐eigen类,自行百度
代码:
matrix.h :
#pragma once
class matrix
{
public:
matrix(int row=3,int col=3);
matrix (const matrix& m);
~matrix(void);
private:
double **dMatData;
int iRow;
int iCol;
public:
int Row() const {return iRow;}
int Col() const {return iCol;}
void SetSize (int row, int col);
double& operator () (int row, int col);
double operator () (int row, int col) const;
matrix& operator = (const matrix& m) ;
friend matrix operator + (const matrix& m1,const matrix& m2);
friend matrix operator - (const matrix& m1,const matrix& m2);
friend matrix operator * (const matrix& m1,const matrix& m2);
friend matrix operator * (const double& num, const matrix& m1);
friend matrix operator * (const matrix& m1,const double& num);
friend matrix operator ~ (const matrix& m);
matrix Inv();
void Unit();
};
matix.cpp :
#include "StdAfx.h"
#include "matrix.h"
#include "math.h"
matrix::matrix(int row,int col)
{
iRow=row;
iCol=col;
dMatData = new double*[row];
for (int i=0; i < row; i++)
{
dMatData[i]= new double[col];
for(int j=0;j<col;j++)
{
dMatData[i][j]=0;
}
}
}
matrix::matrix (const matrix& m)
{
iRow=m.Row();
iCol=m.Col();
dMatData = new double*[iRow];
for (int i=0; i < iRow; i++)
{
dMatData[i]= new double[iCol];
{
memcpy(dMatData[i],m.dMatData[i],sizeof(double)*iCol);
}
}
}
matrix::~matrix(void)
{
for (int i=0; i < iRow; i++)
{
delete[] dMatData[i];
}
delete[] dMatData;
}
double& matrix::operator () (int row, int col)
{
if (row >= iRow || col >= iCol)
{
throw( "matrix::operator(): Index out of range!");
}
return dMatData[row][col];
}
double matrix::operator () (int row, int col) const
{
if (row >= iRow || col >= iCol)
{
throw( "matrix::operator(): Index out of range!");
}
return dMatData[row][col];
}
matrix operator + (const matrix& m1,const matrix& m2)
{
if((m1.Col()!=m2.Col()) ||(m1.Row()!=m2.Row()) )
{
throw( "matrix::operator+: The two matrix have different size!");
}
matrix matTmp(m1.Row(),m1.Col());
for(int i=0;i<m1.Row();i++)
{
for(int j=0;j<m1.Col();j++)
{
matTmp(i,j)=m1(i,j)+m2(i,j);
}
}
return matTmp;
}
matrix &matrix::operator = (const matrix& m)
{
if(iRow!=m.Row()||iCol!=m.Col())
{
SetSize(m.Row(),m.Col());
}
for (int i=0; i < iRow; i++)
{
for(int j=0;j<iCol;j++)
{
dMatData[i][j]=m(i,j);
}
}
return *this;
}
void matrix::SetSize (int row, int col)
{
if (row == iRow && col == iCol)
{
return;
}
double **rsData = new double*[row];
for (int i=0; i < row; i++)
{
rsData[i]= new double[col];
for(int j=0;j<col;j++)
{
rsData[i][j]=0;
}
}
int minRow=(iRow>row)?row:iRow;
int minCol= (iCol>col)?col:iCol;
int colSize = minCol * sizeof(double);
for (int i=0; i < minRow; i++)
{
memcpy( rsData[i], dMatData[i], colSize);
}
for (int i=0; i < minRow; i++)
{
delete[] dMatData[i];
}
delete[] dMatData;
dMatData=rsData;
iRow=row;
iCol=col;
return;
}
matrix operator - (const matrix& m1,const matrix& m2)
{
if((m1.Col()!=m2.Col()) ||(m1.Row()!=m2.Row()) )
{
throw( "matrix::operator-: The two matrix have different size!");
}
matrix matTmp(m1.Row(),m1.Col());
for(int i=0;i<m1.Row();i++)
{
for(int j=0;j<m1.Col();j++)
{
matTmp(i,j)=m1(i,j)-m2(i,j);
}
}
return matTmp;
}
matrix operator * (const matrix& m1,const matrix& m2)
{
if((m1.Col()!=m2.Row()))
{
throw( "matrix::operator*: The col of matrix m1 doesn't equ to row of m2 !");
}
matrix matTmp(m1.Row(),m2.Col());
for(int i=0;i<m1.Row();i++)
{
for(int j=0;j<m2.Col();j++)
{
for(int k=0;k<m2.Row();k++)
{
matTmp(i,j)+=m1(i,k)*m2(k,j);
}
}
}
return matTmp;
}
matrix operator * (const matrix& m1,const double& num)
{
matrix matTmp(m1.Row(),m1.Col());
for(int i=0;i<m1.Row();i++)
{
for(int j=0;j<m1.Col();j++)
{
matTmp(i,j)=m1(i,j)*num;
}
}
return matTmp;
}
matrix operator * (const double& num, const matrix& m1)
{
matrix matTmp(m1.Row(),m1.Col());
for(int i=0;i<m1.Row();i++)
{
for(int j=0;j<m1.Col();j++)
{
matTmp(i,j)=m1(i,j)*num;
}
}
return matTmp;
}
matrix operator ~ (const matrix& m)
{
matrix matTmp(m.Col(),m.Row());
for (int i=0; i < m.Row(); i++)
for (int j=0; j < m.Col(); j++)
{
matTmp(j,i) = m(i,j);
}
return matTmp;
}
matrix matrix::Inv()
{
if (iRow!=iCol)
{
throw("待求逆的矩阵行列不相等!");
}
int i, j, k, vv;
matrix InvMat(iRow,iRow);
InvMat=*this;
int* MainRow=new int[iRow];
int* MainCol=new int[iRow];
double dMainCell;
double dTemp;
for(k = 0;k<iRow;k++)
{
dMainCell = 0;
for( i = k;i<iRow ;i++)
{
for( j = k;j<iRow;j++)
{
dTemp = fabs(InvMat(i, j));
if(dTemp > dMainCell)
{
dMainCell = dTemp;
MainRow[k] = i;
MainCol[k] = j;
}
}
}
if( fabs(dMainCell) < 0.0000000000001)
{
throw("矩阵秩亏");
}
if(MainRow[k] != k)
{
for( j = 0 ;j<iRow;j++)
{
vv = MainRow[k];
dTemp = InvMat(k, j);
InvMat(k, j) = InvMat(vv, j);
InvMat(vv, j) = dTemp;
}
}
if(MainCol[k] != k)
{
for(i = 0;i<iRow;i++)
{
vv = MainCol[k];
dTemp = InvMat(i, k);
InvMat(i, k) = InvMat(i, vv);
InvMat(i, vv) = dTemp;
}
}
InvMat(k, k) = 1.0 / InvMat(k, k);
for( j = 0;j< iRow;j++)
{
if(j != k)
{
InvMat(k, j) = InvMat(k, j) * InvMat(k, k);
}
}
for(i = 0;i<iRow;i++)
{
if( i !=k)
{
for(j = 0;j<iRow;j++)
{
if(j != k)
{
InvMat(i, j) -= InvMat(i, k) * InvMat(k, j);
}
}
}
}
for( i = 0;i< iRow;i++ )
{
if( i != k)
{
InvMat(i, k) = -InvMat(i, k) * InvMat(k, k);
}
}
}
for( k = iRow - 1;k>=0;k--)
{
if(MainCol[k] != k)
{
for( j = 0;j<iRow;j++)
{
vv = MainCol[k];
dTemp = InvMat(k, j);
InvMat(k, j) = InvMat(vv, j);
InvMat(vv, j) = dTemp;
}
}
if(MainRow[k] != k)
{
for( i = 0;i<iRow;i++)
{
vv = MainRow[k];
dTemp = InvMat(i, k);
InvMat(i, k) = InvMat(i, vv);
InvMat(i, vv) = dTemp;
}
}
}
delete[] MainRow;
delete[] MainCol;
return InvMat;
}
void matrix::Unit()
{
for(int i=0;i<iRow;i++)
{
for(int j=0;j<iCol;j++)
{
dMatData[i][j]=(i==j)?1:0;
}
}
}