文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>数组之8.5

数组之8.5

时间:2010-12-04  来源:Mrt-l

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

 

 

 


 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载