C和指针之数组编程练习5 (矩阵相乘)

来源:互联网 发布:大数据平台数据传输 编辑:程序博客网 时间:2024/05/22 11:56

1、问题

5.如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C。这个矩阵的每个元素是由下面的公式决定的:


例如:




结果矩阵中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开始这个事实!



2、代码实现

因为这里传递的参数是 
int *m1, int *m2, int *r, int x, int y, into
我这里还用传递数组指针来实现这个函数
void matrix_multiply1(int (*m1)[2], int (*m2)[4], int (*r)[4],                     int x, int y, int z)


#include <stdio.h>void matrix_multiply(int *m1, int *m2, int *r,                     int x, int y, int z){    int i, j, k;    for (i = 0; i < x; ++i)    {        for (j = 0; j < z; ++j)        {            //p1表示第一个矩阵的行            int *p1 = m1 + i * y;            //p2表示第二个矩阵的列            int *p2 = m2 + j;            for (k = 0; k < y; ++k)            {                *r += *p1 * *p2;                if (k < y -1)                {                   //行向右移动                   ++p1;                   //列向下移动                   p2 += z;                }            }            ++r;        }    }}void matrix_multiply1(int (*m1)[2], int (*m2)[4], int (*r)[4],                     int x, int y, int z){    int i, j, k;    int temp;    for (i = 0; i < x; i++)    {        for (j = 0; j < z; j++)        {            temp = 0;            for (k = 0; k < y; k++)            {                temp += *(*(m1 + i) + k) * *(*(m2 + k) + j);            }            *(*(r + i) + j) = temp;            printf("%d\t", *(*(r + i) + j));        }        printf("\n");    }}int  main(){    int m1[3][2] = {{2, -6}, {3, 5}, {1, -1}};    int m2[2][4] = {{4, -2, -4, -5}, {-7, -3, 6, 7}};    int r[3][4] = {0};    matrix_multiply(m1,m2,r,3,2,4);    for (int i = 0; i < 3; i++)    {        for (int j = 0; j < 4; j++)            printf("%d\t", r[i][j]);        printf("\n");    }    printf("*****\n");    int r1[3][4] = {0};    matrix_multiply1(m1,m2,r1,3,2,4);    return 0;}







3、运行结果

1111deMacBook-Pro:dabian a1111$ vim matrix_multiply.c1111deMacBook-Pro:dabian a1111$ gcc -g -w matrix_multiply.c -o matrix_multiply1111deMacBook-Pro:dabian a1111$ ./matrix_multiply5014-44-52-23-211820111-10-12*****5014-44-52-23-211820111-10-12




原创粉丝点击