/*
* 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个
* x行z列的矩阵C。这个矩阵的每个元素由下面的公式决定的:
* Ci,j = (k=1,until k=y)Ai,k*Bk,j
* 例如:
*--------------------------------------------------
* |2 -6| |50 14 -44 -52|
* |3 5| * |4 -2 -4 -5| = |-23 -21 18 20|
* |1 -1| |-7 -3 6 7| |11 1 -10 -12|
*--------------------------------------------------
* 结果矩阵中 14 这个值 是通过 2*(-2)+(-6)*(-3) 得到的。
* 编写一个函数,用于执行两个矩阵的乘法。函数的原型应该如下:
* void matrix_multiply( int *m1, int *m2, int *r
int x, int y, int z )
* m1 是一个x行y列的矩阵,m2是一个y行z列的矩阵。这两个矩阵应该相乘,结果
* 存储于r中,它是一个x行z列的矩阵。记住,你应该对公式作些修改,以适应
* C 语言下标 从0开始而不是从1开始这个事实。
*/
/* * 考虑到程序实际完成的工作,它实际上相当紧凑的。由于它和矩阵的大小有关,所以这个 * 函数不能使用下标--这个程序是使用指针的好例子。但是,从技术上说它是非法的,因为 * 它将压扁数组。 */
/* 将两个数组相乘 */
void matrix_multiply( int *m1, int *m2, int *r, int x, int y, int z ) { register int *m1p; register int *m2p; register int k; int row; int column;
/* * 外层的两个循环逐个产生结果矩阵的元素。由于这是按照存在顺序 * 进行的。我们可以通过对r进行间接访问来访问这些元素。 */
for( row=0; row<x; row+=1 ) { for( column=0; column<z; column+=1 ) { /* * 计算结果的一个值。这是通过或得指向m1和m2的合适元素的指针, * 当我们进行进行循环时,使他们前进来实现的。 */
m1p = m1 + row * y; m2p = m2 + column; *r = 0;
for( k=0; k<y; k+=1 ) { *r += *m1p * *m2p; m1p += 1; m2p += z; }
/* r 前进一步,指向下一个元素 */
r++; } } }
|
阅读(1769) | 评论(0) | 转发(0) |