C用面向对象的方法封装矩阵类

规则 :

       构造函数名由类名加 "_ctor" 组成 , 析构函数由类名加 "_dtor" 组成 .

              1. 构造函数由 new 函数调用 . 用于初始化成员方法指针 .

              2. 析构函数由 delete 函数调用 . 用于释放类对象动态开辟的内存 .

              3. 子类构造函数调用前 , 要调用父类构造函数 .

              4. 子类析构函数调用后 . 要调用父类析构函数 .

              5. 如果不用 new delete 来生成和销毁对象 , 那么它的构造、析构函数要手工调用 .

              6. 宏定义用 "BASED_" 加类名 . 在派生子类的时候这个表示父类的宏要写在第一位 . 顺序很重要 .

              7. 成员函数调用的第一个参数为对象的指针 . 因为没有系统提供的 this 指针 . 就只能自己传递了 .

              8. 公共成员函数只要声明在对应头文件里就可以了 , 私有的成员函数只写在 c 文件里 , 定义成 static 类型 .

              9. 虚表名称用类名加 "_vt" 组成 . 其声明和定义方法同     的方法 .

              10. 每个类的第一成员是虚表指针 .

              11. 用一个宏实现通过类指针来调用对象的虚成员函数 .

              12. 类的私有数据成员是类的一个 void 类型指针 . void* private; 它在每个类自己的构造函数里初始化 , 只有自己的类才知道它是一个什么样的指针 [ 可能是结构体指针哦 .]

       声明一个类 A, 如下方法 :

         class{

         #define BASED_A/

              int i;/

              int j;

              BASED_A

         }A;

       如果不写宏 , 则该类是不可继承的 .

       A 类派生 B 类的方法如下 :

         class{

         #define BASED_B/       // 这里定义这个宏 , 用来派生新的类 .

              BASED_A/ // 父类

              int a;/

              int b;

              BASED_B

         }B;

       虚表的定义 :

         virtual_tab{

         #define BASED_CLASSNAME_vt/

              void (*func1)();

              BASED_CLASSNAME_vt

         }ClassName_vt;

       优点 :      使用这个方法可以用纯 C 实现面向对象思想编程 .

              可以实现多态 :

              1. 规则 3 保证多态的正确性 . 即父类初始化了成员函数后又被子类重新修改 . 那么在调用的时候就会调用到子类的实现 .

       缺点 :

              1. 不能实现多继承 .// 不过多继承使用的不多 , 也不被广泛提倡 .

              2. 这种写法让编辑器无法智能提示类成员 . 使得程序员编写代码时要很清楚类的成员 .

              3. 没有系统提供的 this 指针 , 需要调用时传递 .

                                                                                                                                                                                                                                                                               Designed by o07sai.

 

 

 

 

矩阵运算之 —[ 求逆 ]

全选主元高斯 - 约旦消去法

[摘选自: C常用算法程序集-徐士良(源程序) ]

一、 功能

用全选主元高斯 - 约旦 (Gauss-Jordan) 消去法同时求角系数矩阵相同而右端具有 m 组常数向量的 n 阶线性代数方程组 AX=B. 其中

 

二、 方法说明

全选主元高斯 - 约旦法的步骤如下 :

对于 k 0 n-1 作如下变换 :

(1)     全选主元

从系数矩阵 A 的第 k 行、第 k 列开始的右下角子阵中选取绝对值最大的元素 , 并通过行交换 ( 列交换 ) 将它交换到主元素的位置上 .

(2)     归一化

 

(3)     消去

 

最后对 B 进行恢复 , B 中的每一列即为每一个方程组的解 .

上面解方程的过程中其实包含了矩阵求逆了 . B 看成是单位矩阵,那么X就是A 的逆 .此时 m=n. 这样 . 用上面的方法 , 按三步进行 , 就可以求矩阵 A 的逆了 . 不需要最后一步 .


源码下载地址 : http://download.csdn.net/source/2206411


或是在www.csdn.net 资源下载中搜索关键字: 面向资源 矩阵运算 也可找到.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现有两个 CVector 存放数据的自定义动态数组,采用一维动态数组存储矩阵数据 CMatrix 实现的矩阵 使用的时候包含#include "Matrix.h"就行 CMatrix的接口函数都在"Matrix.h"里面 CVector的接口函数在"Vector.h"里,"Matrix.h"里包含了"Vector.h" 具体用法与测试用例Main.cpp里有3个测试用例,分别是针对构造函数属性计算与运算符重载的 内已包含测试工程xp\vc6.0\上亲测通过,并经过BoundsChecker测试没有内存泄漏。有兴趣的童鞋可以下作参考。 注意: 1、下标都是从0开始,数学课上矩阵下标都是从1开始,但是工作后习惯0开始,矩阵M的第一个元素是M(0,0) 2、型定死为double,原来作业是模板,由于vc6对模版支持不好,另矩阵计算double比较理想、整型几乎只能作加减 提供了多种初始化方式,int[]、float[]、double[]均可构造初始化,或则先构造出CVector再由CVector初始化。 3、定义了一个最大允许误差#define permit_eof (1.0e-13),判断相等使用宏 #define EQUAL(a,b) ( ((b) - (a) < permit_eof)&&((a) - (b) < permit_eof) ? (TRUE) : (FALSE) ) 正常输出的时候绝对值小于permit_eof 的时候清零处理,想要指定精度输出请用PrintOut 鸣谢:CSDN上supermegaboy君的C/C++左值性精髓,读后略有所感,空闲时重构了下大学时的作业,着重区分了函数返回值的左右值 =================================================附录:接口函数========================================================================== 开放的接口: CVector //构造函数 CVector(); virtual ~CVector(); CVector(const size_t &nSize;); CVector(const CVector & vIn);//拷贝构造函数 CVector(const double* const pData,const size_t &nSize;); CVector(const float* const pData,const size_t &nSize;); CVector(const int* const pData,const size_t &nSize;); //公开的成员函数 double at(const size_t& uIndex)const;//作右值 BOOL push_back(const double& dbIn ); BOOL resize(const size_t& nSize); size_t size()const; //重载操作符 double& operator()(const UINT& uIndex);//重载()运算符,可作左值 //重载的运算符 double& operator()(const size_t& xr,const size_t& xc);//重载()运算符,可作左值 CVector& operator=(const CVector &);//重载=运算符 double operator*(const CVector & )const;//重载*运算符,两向量相乘 CVector operator*(const double α)const;//重载*运算符,向量乘以实数alpha CVector& operator*=(const double α);//重载*=算符,向量乘以实数alpha CVector operator+(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator+=(const CVector & );//重载+=算符,向量加上向量 CVector operator-(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator-=(const CVector & );//重载+=算符,向量加上向量 CVector operator+(const double α)const;//重载+运算符,向量加上实数alpna CVector& operator+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值