华山论剑 之 [矩阵]
应施鹏兄弟的要求就矩阵模块的实现开贴交流,希望众英雄以代码展现自己的思想与风格。在论坛里不可能有什么物质奖励,能得到的只有大家的认可,而认可度的体现之一即专家分。
这一贴的分数只为吸引大家瞩目,最后将平分给关注者。
而对于实际参与者,只要代码完整实现了矩阵操作,并得到大家的认可,我将以个人名义奖励100专家分。
注意,是“每位”100专家分!
这可以算作一次团队开发,成员是论坛所有有兴趣参与的人。既然是个团队项目,就不能任由个人意愿去随意发挥。
现在讨论一下模块的接口标准。下面是初步设定,可以继续讨论。但定稿后,参与者必需严格按接口要求编写模块。
1.模块的编写语言限定为C语言(毕竟这是在C论坛里),所以也就用不到类的概念。矩阵数据的存储类型为结构。
这里规定结构的名称为MATRIX。
矩阵元素的数据类型为double。
由于这次讨论源于fourleaves对三元组行逻辑链接的讨论,所以要求邻接表(或其它矩阵压缩算法)实现,对于二维数组的实现不予考虑(这样的实现奖励专家分)。
当然,如果有人能自动识别矩阵的稠密度从而能自动切换压缩矩阵与非压缩矩阵,将给予500专家分的奖励。
MATRIX结构的内部成员定义不作要求。我们不提倡外部程序直接操作MARIX,而是应该通过相应的操作函数来完成。
2.矩阵操作函数接口定义。
MATRIX * Matrix_creat(int rows, int columns);//创建rows行columns列矩阵,元素初始值为0
void Matrix_free(MATRIX * mat);//销毁mat矩阵
int Matrix_rows_len(MATRIX * mat);//获取矩阵mat的行数,mat为空指针时返回0
int Matrix_cols_len(MATRIX * mat);//获取矩阵mat的列数,mat为空指针时返回0
int Matrix_set(MATRIX * mat, int row, int column, double value);//设置mat矩阵第row行第column列的元素值为value,操作成功返回0,否则返回一个非0值
double Matrix_get(MATRIX * mat, int row, int column);//获取mat矩阵第row行第column列的元素值
MATRIX * Matrix_add(MATRIX * mat1, MATRIX * mat2);//计算两个矩阵相加,返回和矩阵。当两个矩阵不能作加法运算时返回NULL
MATRIX * Matrix_mul(MATRIX * mat1, MATRIX * mat2);//计算两个矩阵相乘,注意是mat1左乘mat2。如果不能作乘法运算返回NULL
MATRIX * Matrix_mul_real(MATRIX * mat, double a);//计算矩阵与实数相乘
MATRIX * Matrix_dot_mul(MATRIX * mat1, MATRIX * mat2);//计算两个矩阵的点乘。如果不能作运算返回NULL
MATRIX * Matrix_trans(MATRIX * mat);//返回mat的转置矩阵
先这么多吧。由于时间仓促水平有限,可能有不合理的地方,欢迎各位参与讨论并给出修改或补充意见。