C++矩阵运算类库很实用.docx
《C++矩阵运算类库很实用.docx》由会员分享,可在线阅读,更多相关《C++矩阵运算类库很实用.docx(11页珍藏版)》请在冰豆网上搜索。
C++矩阵运算类库很实用
C++进行矩阵运算类库
头文件:
Matrix.h
#ifndefMATRIX_H
#defineMATRIX_H
#include"iostream”
#include”string”
#include
#include
#include〈fstream〉
#include〈sstream〉//istringstream必须包含这个头文件
usingnamespacestd;
classMatrix
{
public:
voidreadMatrix(stringfileName);
voidshowMatrix();
voidwriteMatrix(stringstr);
voidinversion();//求矩阵的逆矩阵
voidchange();//求矩阵的转置
voidoperator+(Matrix&a);//声明重载运算符的“+”函数
voidoperator—(Matrix&a);//声明重载运算符的“-"函数
voidoperator*(Matrix&a);//声明重载运算符的“*”函数
voidoperator=(Matrix&a);//声明重载运算符的“=”赋值函数
vector>_mat;
introw;
intcol;
};
#endif
源文件:
main.cpp
#include”iostream”
#include"string"
#include
#include
#include〈fstream>
#include#include"Matrix.h"
#include〈time.h〉//使用随机数
#include〈cmath〉//数学计算
usingnamespacestd;
//将运算得到的数据存储到box中,形成一个完整的Matrix量
Matrixbox_mul;//矩阵相乘的结果
Matrixbox_inver;//矩阵的逆的结果
Matrixbox_change;//矩阵转置的结果
Matrixbox_plus;//矩阵加的结果
Matrixbox_cut;//矩阵减的结果
voidMatrix:
:
readMatrix(stringfileName)
{
ifstreamifile(fileName。
c_str(),ios:
:
in);/*声明一个输入句柄,打开fileName所指文件.
接下来就可以通过ifile>>***来读取1.txt中的内容了*/
doubletmp;
stringline;
vectorwhile(getline(ifile,line))
{
istringstreamistr(line);
while(istr>〉tmp)
{
row.push_back(tmp);//在row尾部插入读入的数据
}
this—〉col=row.size();
_mat。
push_back(row);
row.clear();
istr。
clear();
line。
clear();
}
this-〉row=_mat。
size();//这里的row不是vector变量,是matrix中的row
ifile。
close();
}
voidMatrix:
:
showMatrix()
{
cout<〈”矩阵:
"〈//cout〈<"row="〈//cout〈〈”col=”〈
for(inti=0;i〈row;i++)
{
for(intj=0;j〈col;j++)
cout〈〈_mat[i][j]〈〈"";
cout〈〈endl;
}
}
voidMatrix:
:
writeMatrix(stringstr)
{
ofstreamos(str,ios:
:
trunc);
//ofstreamos(”C:
\\Users\\Administrator\\Desktop\\数据矩阵W.txt”,ios:
:
trunc);
if(os)
{
for(inti=0;i{
for(intj=0;j〈col;++j)
os〈〈_mat[i][j]<<””;
os〈〈endl;
}
}
else
cerr<〈”无法打开文件!
"〈〈endl;
}
voidMatrix:
:
operator+(Matrix&a)
{
//cout<<"矩阵的和:
”〈doubleb[200][200];
for(inti=0;i{
for(intj=0;j
b[i][j]=_mat[i][j]+a。
_mat[i][j];
}
box_plus.col=col;box_plus。
row=row;//行列数设置好
box_plus。
_mat。
clear();
vector〈double>t;
for(inti=0;i{
for(intj=0;j
{
t。
push_back(b[i][j]);
}
box_plus._mat.push_back(t);//数据输入_mat量中
t.clear();
}
}
voidMatrix:
:
operator-(Matrix&a)
{
//cout<<"矩阵的差:
”〈doubleb[200][200];
for(inti=0;i〈row;i++)
{
for(intj=0;j〈col;j++)
b[i][j]=_mat[i][j]-a。
_mat[i][j];
}
box_cut.col=col;box_cut.row=row;//行列数设置好
box_cut._mat.clear();
vector〈double〉t;
for(inti=0;i〈row;i++)
{
for(intj=0;j
{
t.push_back(b[i][j]);
}
box_cut._mat。
push_back(t);//数据输入_mat量中
t。
clear();
}
}
voidMatrix:
:
operator*(Matrix&a)//可连续使用
{
//cout〈<"矩阵相乘:
"<〈endl;
doubleb[200][200];
for(inti=0;i{
for(intj=0;j〈a。
col;j++)
{
b[i][j]=0;
for(intk=0;k
{
b[i][j]+=_mat[i][k]*a。
_mat[k][j];
}
}
}
box_mul。
col=a.col;
box_mul。
row=row;//行列数设置好
box_mul._mat。
clear();
vector〈double〉t;
for(inti=0;i〈row;i++)
{
for(intj=0;j〈a.col;j++)
{
t.push_back(b[i][j]);
}
box_mul。
_mat.push_back(t);//数据输入_mat量中
t。
clear();
}
}
voidMatrix:
:
operator=(Matrix&a)
{
row=a。
row;col=a。
col;
_mat.clear();
vector〈double>t;
for(inti=0;i〈row;i++)
{
for(intj=0;j〈col;j++)
{
t.push_back(a._mat[i][j]);
}
_mat。
push_back(t);
t。
clear();
}
}
voidMatrix:
:
change()//可连续使用
{
//cout〈〈"矩阵的转置:
"<〈endl;
doubleb[200][200];
for(inti=0;i{
for(intj=0;j
b[j][i]=_mat[i][j];
}
box_change.col=row;box_change.row=col;//行列数设置好
box_change。
_mat。
clear();
vectort;
for(inti=0;i〈col;i++)
{
for(intj=0;j〈row;j++)
{
t。
push_back(b[i][j]);
}
box_change._mat.push_back(t);//数据输入_mat量中
t。
clear();
}
}
voidMatrix:
:
inversion()//可连续使用
{
//cout<〈”矩阵的逆:
”〈〈endl;
inti,j,k,M=this—〉col,N=2*this—>col;
doubleb[200][200];
for(i=0;i〈M;i++)//赋值
{
for(j=0;j〈M;j++)
b[i][j]=_mat[i][j];}
for(i=0;i〈M;i++)//扩展
for(j=M;j〈N;j++)
{
if(i==(j—M))
b[i][j]=1;
else
b[i][j]=0;
}
for(i=0;i{
if(b[i][i]==0)
{
for(k=i;k{
if(b[k][i]!
=0)
{
for(intj=0;j〈N;j++)
{
doubletemp;
temp=b[i][j];
b[i][j]=b[k][j];
b[k][j]=temp;
}
break;
}
}
if(k==M)
{
cout〈<"该矩阵不可逆!
\n”;
exit(0);
}
}
for(j=N-1;j>=i;j——)
b[i][j]/=b[i][i];
for(k=0;k〈M;k++)
{
if(k!
=i)
{
doubletemp=b[k][i];
for(j=0;jb[k][j]-=temp*b[i][j];
}
}
}
box_inver。
col=col;box_inver.row=row;//行列数设置好
box_inver._mat.clear();
vector〈double>t;
for(inti=0;i{
for(intj=M;j〈N;j++)
{
//cout<
t.push_back(b[i][j]);
}
box_inver._mat。
push_back(t);//数据输入_mat量中
t.clear();
}
}
intmain()
{
///////////////////////////////
system("pause");
return0;
}
|
|
|
|
|
|