分享
 
 
 

C++类写的矩阵计算

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

#pragma once

//矩阵类

class Matrix

{

private:

double * p;

//矩阵宽度

long width;

//矩阵高度

long height;

public:

long getHeight();

long getWidth();

bool isVector();//如果是false,那就是一个数

double Arg();//求行列式

bool isPtv();//是否正定

Matrix T();//转置

Matrix subMatrix(long offset);

void Test();//测试函数

/***********重载部分-Overloaded Part*****************/

Matrix operator+(Matrix &);

Matrix operator-(Matrix &);

Matrix operator*(Matrix &);

friend Matrix operator*(double alpha,Matrix &);//实数与矩阵相乘

Matrix operator*(double alpha);//矩阵与实数相乘

Matrix operator/(Matrix &);//实际是实数相除或矩阵和实数相除

Matrix operator/(double sub);

Matrix operator+=(Matrix &);

Matrix operator-=(Matrix &);

Matrix operator*=(double alpha);//矩阵与实数相乘

friend Matrix sqrt(Matrix m);//开方

friend double abs(Matrix &);//取绝对值

Matrix &operator=(Matrix &);

double * operator[](long heightPos);//用于实现用[][]操作矩阵元素

friend ostream & operator<<(ostream &,Matrix &);

Matrix(void);//default constructor

Matrix(long n);//单位矩阵

Matrix(double * arrAddress,long arrWidth);//构造一维矩阵

Matrix(double * arrAddress,long arrWidth,long arrHeight);

Matrix(const Matrix &);//copy constructor

~Matrix(void);//default destructor

/***********重载部分-Overloaded Part*****************/

};

#include "StdAfx.h"

#include ".\matrix.h"

Matrix::Matrix(void)

{

p=new double[1];

width=0;

height=0;

}

Matrix::Matrix(long n)

{

height=width=n;

p=new double[n*n];

for(long i=0;i<n;i++){

for(long j=0;j<n;j++){

if(i==j) *(p+n*i+j)=1;

else *(p+n*i+j)=0;

}

}

}

Matrix::Matrix(double * arrAddress,long arrWidth)

{

long arrHeight=1;

p=new double[arrWidth*arrHeight];

for(long i=0;i<arrHeight;i++){

for(long j=0;j<arrWidth;j++){

*(p+arrWidth*i+j)=*(arrAddress+arrWidth*i+j);

}

}

width=arrWidth;

height=arrHeight;

}

Matrix::Matrix(double * arrAddress,long arrWidth,long arrHeight)

{

p=new double[arrWidth*arrHeight];

for(long i=0;i<arrHeight;i++){

for(long j=0;j<arrWidth;j++){

*(p+arrWidth*i+j)=*(arrAddress+arrWidth*i+j);

}

}

width=arrWidth;

height=arrHeight;

}

Matrix::Matrix(const Matrix & m)//copy constructor

{

height=m.height;

width=m.width;

p=new double[height*width];

for(long i=0;i<height;i++){

for(long j=0;j<width;j++){

*(p+width*i+j)=*(m.p+width*i+j);

}

}

}

long Matrix::getWidth(){

return width;

}

long Matrix::getHeight(){

return height;

}

bool Matrix::isVector()

{

return !(width==1 && height==1);

}

Matrix Matrix::subMatrix(long offset)

{

assert(height==width && offset<=width && offset>=0);

double * t=new double[offset*offset];

for(long i=0;i<offset;i++){

for(long j=0;j<offset;j++){

*(t+offset*i+j)=*(p+width*i+j);

}

}

Matrix m(t,offset,offset);

delete [] t;

return m;

}

double Matrix::Arg()//矩阵的行列式

{

assert(width==height);

double result=1;

double k;

Matrix m=*this;

for(long i=0;i<height-1;i++){//Gauss消去法,变换成上三角矩阵

for(long j=i+1;j<height;j++){

k=m[j][i]/m[i][i];

m[j][i]=0;

for(long n=i+1;n<width;n++){

m[j][n]=m[j][n]-k*m[i][n];

}

}

}

for(long i=0;i<height;i++){

for(long j=0;j<width;j++){

if(i==j) result*=m[i][j];

}

}

return result;

}

bool Matrix::isPtv()

{

assert(width==height);//是方阵才可以计算

bool result=true;

Matrix m;

for(long i=1;i<=height;i++){

m=this->subMatrix(i);

if(m.Arg()<=0){

result=false;

break;

}

}

return result;

}

Matrix Matrix::T()

{

double * t=new double[width*height];

for(long i=0;i<height;i++){

for(long j=0;j<width;j++){

*(t+height*j+i)=*(p+width*i+j);

}

}

Matrix m(t,height,width);

delete [] t;

return m;

}

Matrix Matrix::operator +(Matrix &m1)

{

assert(m1.height==height && m1.width==width);

long tmpHeight=m1.height;

long tmpWidth=m1.width;

double * t=new double[tmpWidth*tmpHeight];

for(long i=0;i<tmpHeight;i++){

for(long j=0;j<tmpWidth;j++){

*(t+tmpWidth*i+j)=*(m1.p+tmpWidth*i+j)+*(p+tmpWidth*i+j);

}

}

Matrix m(t,tmpWidth,tmpHeight);

delete [] t;

return m;

}

Matrix Matrix::operator -(Matrix &m1)

{

assert(m1.height==height && m1.width==width);

long tmpHeight=m1.height;

long tmpWidth=m1.width;

double * t=new double[tmpWidth*tmpHeight];

for(long i=0;i<tmpHeight;i++){

for(long j=0;j<tmpWidth;j++){

*(t+tmpWidth*i+j)=*(p+tmpWidth*i+j)-*(m1.p+tmpWidth*i+j);

}

}

Matrix m(t,tmpWidth,tmpHeight);

delete [] t;

return m;

}

Matrix Matrix::operator *(Matrix &m1)

{

if(!this->isVector() && m1.isVector()){//左为数,右为矩阵

Matrix m;

m=p[0]*m1;

return m;

}else if(this->isVector() && !m1.isVector()){//左为矩阵,右为数

Matrix m;

m=*this*m1[0][0];

return m;

}else if(!this->isVector() && m1.isVector()){//左右都为数

double * t=new double[1];

t[0]=p[0]*m1[0][0];

Matrix m(t,1,1);

delete [] t;

return m;

}else if(this->isVector() && m1.isVector() && width==m1.height){//左为矩阵,右为矩阵

double sum;

double * t=new double[height*m1.width];

for(long i=0;i<height;i++){

for(long j=0;j<m1.width;j++){

sum=0;

for(long k=0;k<width;k++){

sum+=(*(p+width*i+k))*(m1[k][j]);

}

*(t+m1.width*i+j)=sum;

}

}

Matrix m(t,m1.width,height);

delete [] t;

return m;

}else{

assert(0);//未知运算

return *this;

}

}

Matrix operator*(double alpha,Matrix & m1)

{

Matrix m=m1;

for(long i=0;i<m.height;i++){

for(long j=0;j<m.width;j++){

m[i][j]=alpha*m1[i][j];

}

}

return m;

}

Matrix Matrix::operator*(double alpha)

{

return alpha*(*this);

}

Matrix Matrix::operator+=(Matrix & m)

{

return *this+m;

}

Matrix Matrix::operator-=(Matrix & m)

{

return *this-m;

}

Matrix Matrix::operator *=(double alpha)

{

return *this*alpha;

}

Matrix sqrt(Matrix m)

{

m[0][0]=sqrt(m[0][0]);

return m;

}

double abs(Matrix & m)

{

double sum=0;

for(long i=0;i<m.height;i++){

for(long j=0;j<m.width;j++){

sum+=m[i][j]*m[i][j];

}

}

return sqrt(sum);

}

Matrix Matrix::operator /(Matrix &m1)

{

assert(m1.width==1 && m1.height==1);

return *this/m1[0][0];

}

Matrix Matrix::operator /(double sub)

{

Matrix m=*this;

for(long i=0;i<height;i++){

for(long j=0;j<width;j++){

m[i][j]=*(p+width*i+j)/sub;

}

}

return m;

}

Matrix & Matrix::operator =(Matrix & m)

{

if(&m==this) return *this;

height=m.height;

width=m.width;

delete [] p;

p=new double[height*width];

for(long i=0;i<height;i++){

for(long j=0;j<width;j++){

*(p+width*i+j)=*(m.p+width*i+j);

}

}

return *this;

}

double * Matrix::operator [](long heightPos)

{

assert(heightPos>=0 && heightPos<height);

return p+width*heightPos;

}

ostream & operator<<(ostream & os,Matrix & m)

{

os<<"Matrix:height="<<m.height<<endl;

os<<"Matrix:width="<<m.width<<endl;

for(long i=0;i<m.height;i++){

for(long j=0;j<m.width;j++){

os<<m[i][j]<<" ";

}

os<<endl;

}

return os;

}

Matrix::~Matrix(void)

{

delete [] p;

}

void Matrix::Test(){

double arr[4][4]={{1,1,1,1},{1,2,3,4},{1,3,6,10},{1,4,10,20}};

Matrix m1,m(&arr[0][0],4,4),m2(&arr[0][0],4,4);

m.isPtv();

/*

cout<<"arranger="<<m.Arg()<<endl;

cout<<m;*/

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有