Chinaunix首页 | 论坛 | 博客
  • 博客访问: 383951
  • 博文数量: 55
  • 博客积分: 1907
  • 博客等级: 上尉
  • 技术积分: 869
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 19:30
文章分类

全部博文(55)

文章存档

2011年(32)

2010年(23)

分类: C/C++

2010-12-04 11:49:31

/*
 * 如果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++;
        }
    }
}

 

 

 


 

阅读(1744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~