CMatrix类 矩阵类

  • 不是我写的,仅分享学习!书上配套,如有侵权,速删
  • 与测绘程序设计配套(C++) 矩阵类 ,这个类鲁棒性不好
  • 矩阵运算类我更推荐eigen类,自行百度
  • 代码:
    • matrix.h :
    • matix.cpp :

不是我写的,仅分享学习!书上配套,如有侵权,速删

与测绘程序设计配套(C++) 矩阵类 ,这个类鲁棒性不好

矩阵运算类我更推荐eigen类,自行百度

代码:

matrix.h :

#pragma once
class matrix
{public:matrix(int row=3,int col=3);// copy constructormatrix (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;//重载获取矩阵元素函数,只有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;}}
}// copy constructor,
//拷贝构造函数的作用:
//(1)以类对象作为函数参数传值调用时;
//(2)函数返回值为类对象;
//(3)用一个已定义的对象去初始化一个新对象时;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];// for(int j=0;j<iCol;j++){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)
{//revised in 2011-4-1, by Daiwujiao//   if(iRow!=m.Row()||iCol!=m.Col())//{//       throw( "matrix::operator=: The two matrix have different size!");//}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;
}//重载预算符*,两个矩阵相乘,m1的列要等于m2的行
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;}}
}

CMatrix类 矩阵类 C++相关推荐

  1. 和我一起写矩阵类(一)

    和我一起写矩阵类(一) 大连理工大学软件学院WAKU(转载请保留署名) 最近Mr.Zeng的一个作业就是自己实现一个矩阵类,这是一个非常有实用价值的类.我花了几天完成了,期间也增长了很多知识,不敢独享 ...

  2. 一个矩阵类,很好用,分享给大家

    这是在做一个神经网络训练时候发现得一个矩阵类,做的很好,推荐给大家,原来的矩阵是从txt中加载数据,现在添加函数bool LoadDataFromBase(); 实现从数据库中添加数据 / // Ma ...

  3. c++变幻的矩阵_C++课程设计c++矩阵类(简洁版)

    设计报告 学院:信息科学与技术学院 专业:电子信息工程 年级: 07 级 2 班 姓名:王伟男 学号: 2007082060 程序名称: c++ 矩阵类关于运算符的重载. 指导老师:常耀辉 本程序是一 ...

  4. C++实战笔记(一):矩阵类

    前言   上大学之前就对C++有过一些了解,知道C++是一种功能十分强大的语言.大一时学习了C语言,了解了面向过程的编程方法.现在大三开始学习C++,初步接触了面向对象的编程思想,对C++功能更为着迷 ...

  5. c++矩阵类_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...

    当学习完矩阵的定义以后,我们来学习矩阵的基本运算,与基本性质 矩阵的基本运算:矩阵的加法,每一个对应元素相加,对应结果的矩阵 例子:矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩,两个矩阵相加就 ...

  6. JavaScript实现完整的matrix矩阵类(附完整源码)

    JavaScript实现完整的matrix矩阵类(附完整源码) matrix.js完整源代码 matrix.js完整源代码 export const shape = (m) => {const ...

  7. c++矩阵类_数据结构-JavaScript矩阵类的设计与实现

    矩阵是线性代数课学习的重点内容之一,也是线性代数常见工具之一,在应用数学.统计分析.计算机科学.计算机图像处理级物理等多学科中均有应用.矩阵主要是指数据的行列排列的形式,由行row与列col所组成,在 ...

  8. c++矩阵类_面向对象有限元编程|单元类

    单元对象是构成整个结构对象的基本要素,如杆单元,梁单元,板单元,壳单元等等.虽然单元形状和特性各不相同,但基本特征和功能是相同的.比如都具有一定的几何形状,通过节点与其它单元连接,包含材料信息,在结构 ...

  9. python定义一个1xn矩阵_Python实现的矩阵类实例

    本文实例讲述了Python实现的矩阵类.分享给大家供大家参考,具体如下: 科学计算离不开矩阵的运算.当然,python已经有非常好的现成的库: 我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练 ...

  10. 利用二维数组实现一个矩阵类:Matrix

    利用二维数组实现一个矩阵类:Matrix.要求提供以下操作: (1)set(int row, int col, double value):将第row行第col列的元素赋值为value: (2)get ...

最新文章

  1. JavaScript文件中调用AngularJS内部方法或改变$scope变量
  2. Python-----多线程threading用法
  3. 我,AI专家,模型检测COVID-19准确率高达97.5%,约吗
  4. Django 笔记3 -- URL
  5. 关于VS环境下制作和使用静态库和动态库
  6. 深度学习之卷积神经网络 ResNet
  7. webbrowser 检测ajax,控制台获取网页AJAX的返回数据,用的WebBroWser
  8. DIoU Loss论文阅读
  9. JDK9.0.4安装配置
  10. Android之远程图片获取和本地缓存
  11. 博客样式-bbsmax4风格V0.2
  12. 英特尔图形安装程序的linux,如何在我的系统中安装英特尔图形驱动程序?
  13. 文字转换片假字_模仿文字转换笔迹,word手写字体在线生成器网站
  14. 打印机出现另存为xps_打印机打印文件时弹出另存为xps/pdf该怎办?
  15. The RFB Protocol(RFB协议)简介
  16. QML 全屏 输入法无法显示
  17. 重磅!美图技术团队发布开源 ethereum dpos 实现
  18. Sql递归(用with 实现递归查询)
  19. 微信公众号开发移动端应用
  20. 全栈开发-IDE介绍与设置、字符串格式化、数据类型、for循环

热门文章

  1. opencv 把3通道图像转成单通道_【3】OpenCV图像处理模块(4)图像腐蚀与膨胀
  2. 关于Linux系统启动过程,你应该了解这些
  3. dls 深度受限搜索java_JAVA深入学习(栈和队列)之栈
  4. c语言turboc报错显示,C语言新手问个关于C语言在TurboC上运行的问题
  5. re模块常用修饰符_re模块中常用功能函数
  6. echarts 获取点击的y轴数值_ECharts关系图
  7. php上js实现ajax请求,原生JS实现ajax与ajax的跨域请求实例
  8. java 内存屏障_关于Java中的内存屏障
  9. 矩阵运算_Eigen使用_基本数据类型
  10. Cmake使用示例与整理