和我一起写矩阵类(一) - WAKU的专栏
来源:百度文库 编辑:神马文学网 时间:2024/04/30 05:10:52
大连理工大学软件学院WAKU(转载请保留署名)
最近Mr.Zeng的一个作业就是自己实现一个矩阵类,这是一个非常有实用价值的类。我花了几天完成了,期间也增长了很多知识,不敢独享,拿出来和大家共同学习。由于本人水平很非常有限,有错误不要给我面子,请尽快指出,我将不胜感激!!
开始吧。
矩阵也是一种数据结构,所以在设计之前一定要明确有哪些数据和哪些操作。首先,最容易想到的,矩阵要有一个一个二维数组,好这简单:
double array[3][3];
先等一下,为什么是double类型的?为什么是3x3的二维数组,如果图省事,这么定义当然可以,而且在相当一部分场合中,这个矩阵类也很实用。
我们要有更高的追求,要想办法使我们的类寿命更长。改进它:
类型用模板,可以花最少的时间最大程度上的提高代码的重用性。
template
那么二维数组应该几乘几的呢,答案是由用户确定。数组在矩阵使用的时候动态创建,可大可小,最具有灵活性。那么动态的二维数组应如何表示呢?大家都动态创建过一维数组,写过类似这样的语句:
int *p = new int[10];
new关键字动态的申请了10个int类型的连续空间,并把这段连续空间的首地址赋给指针p。然后就可以使用p[i]来引用数组元素,因为数组名就是指针。以此类推,动态二维数组也应该用指针来表示、来引用元素。在定义指针之前,还是回顾一下二维数组的一些概念,举例说明:
double array[3][3];
定义了3x3的double型数组,由于内存是线性的,所以这9个元素在内存中都是“一条直线”似的存放。array[0][0]是头一个元素,array[2][2]是最后一个元素,这很好理解。那么array[0]代表什么?它是什么东西?
它其实也是个指针,指向数组的第一行元素的行首。同理array[1]是第二行行首指针,array[2]是第三行。array呢?它是数组名,那肯定也是个指针,但是它可不是我们常用的那种指针,而是一个指向指针的指针(二级指针)。它指向的是“指向第一行行首的指针”。看着像一个绕口令,仔细琢磨一下就明白了。如果你感兴趣,输入以下代码并执行:
double array[3][3];
cout<<&array[0]<你会发现输出的值是完全相同的,这就证明了array指向了array[0]。总结一下就是:
想表示或引用几维数组,就需要几级指针。
那么我们的类属性的声明就差不多了:
template
class CMatrix
{
int m; //行数
int n; //列数
T** p; //二维数组指针
};
由于是动态创建的数组,所以矩阵的行和列各需要用一个int型变量来记录。p就是用模板创建的二级指针,来表示二维数组。
下一次我们就开始类方法的设计。大家觉得我写的还可以,麻烦贵手轻抬回一下贴,让我知道有人在看,好有动力写下去,谢谢~~
最近Mr.Zeng的一个作业就是自己实现一个矩阵类,这是一个非常有实用价值的类。我花了几天完成了,期间也增长了很多知识,不敢独享,拿出来和大家共同学习。由于本人水平很非常有限,有错误不要给我面子,请尽快指出,我将不胜感激!!
开始吧。
矩阵也是一种数据结构,所以在设计之前一定要明确有哪些数据和哪些操作。首先,最容易想到的,矩阵要有一个一个二维数组,好这简单:
double array[3][3];
先等一下,为什么是double类型的?为什么是3x3的二维数组,如果图省事,这么定义当然可以,而且在相当一部分场合中,这个矩阵类也很实用。
我们要有更高的追求,要想办法使我们的类寿命更长。改进它:
类型用模板,可以花最少的时间最大程度上的提高代码的重用性。
template
那么二维数组应该几乘几的呢,答案是由用户确定。数组在矩阵使用的时候动态创建,可大可小,最具有灵活性。那么动态的二维数组应如何表示呢?大家都动态创建过一维数组,写过类似这样的语句:
int *p = new int[10];
new关键字动态的申请了10个int类型的连续空间,并把这段连续空间的首地址赋给指针p。然后就可以使用p[i]来引用数组元素,因为数组名就是指针。以此类推,动态二维数组也应该用指针来表示、来引用元素。在定义指针之前,还是回顾一下二维数组的一些概念,举例说明:
double array[3][3];
定义了3x3的double型数组,由于内存是线性的,所以这9个元素在内存中都是“一条直线”似的存放。array[0][0]是头一个元素,array[2][2]是最后一个元素,这很好理解。那么array[0]代表什么?它是什么东西?
它其实也是个指针,指向数组的第一行元素的行首。同理array[1]是第二行行首指针,array[2]是第三行。array呢?它是数组名,那肯定也是个指针,但是它可不是我们常用的那种指针,而是一个指向指针的指针(二级指针)。它指向的是“指向第一行行首的指针”。看着像一个绕口令,仔细琢磨一下就明白了。如果你感兴趣,输入以下代码并执行:
double array[3][3];
cout<<&array[0]<
想表示或引用几维数组,就需要几级指针。
那么我们的类属性的声明就差不多了:
template
class CMatrix
{
int m; //行数
int n; //列数
T** p; //二维数组指针
};
由于是动态创建的数组,所以矩阵的行和列各需要用一个int型变量来记录。p就是用模板创建的二级指针,来表示二维数组。
下一次我们就开始类方法的设计。大家觉得我写的还可以,麻烦贵手轻抬回一下贴,让我知道有人在看,好有动力写下去,谢谢~~
和我一起写矩阵类(一) - WAKU的专栏
一本杂志和我的十年--04:专栏和圆桌
跟我一起写 Makefile
跟我一起写 Makefile
和名家一起写小说
我的日志- 一起写网(17xie.com)
和我一起读书去!(书籍)
和我一起变态
网友续写《我奋斗了18年才和你坐在一起喝咖啡》!
可以让你少奋斗10年的工作经验。(写的非常好,转来和大家一起分享!)
[精华] 跟我一起写 Makefile
[精华] 跟我一起写 Makefile
[精华] 跟我一起写 Makefile
跟我学XSL(一)(转) - hyde82的专栏
国庆,我们一起想想“我和我的国家”
c#泛型和反射的设计应用(一) - yutao051的专栏 - CSDN博客
跟我一起读教父评论轨(一)
不能和你一起到老那是我的遗憾(凄凉的网络爱情续)
真的很好的网站都被我找到了,和大家一起分享(转)
我和学生一起成长
和我一起读书去
我和你一起唱
关于职业选择与规划(献给和我一起拼搏的朋友们)
我喜欢的网站,和大家一起分享