C与指针 五 矩阵相乘

来源:互联网 发布:网络推广协议 编辑:程序博客网 时间:2024/05/29 08:29

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


        结果矩阵中14这个值是通过2X-2加上-6X-3得到的。编写一个函数,用于执行两个矩阵的乘法。函数的原型应该如下:

void matrix_multiply( int *ml, int *m2, int *r,int x, int y, int z );

        m1是一个x行y列的矩阵,m2是一个y行Z列的矩阵。这两个矩阵应该相乘,结果存储于r中,它是一个x行z列的矩阵。记住,你应该对公式作些修改。

//矩阵相乘 
#include<stdio.h>


void matrix_multiply1(int (*m1),int (*m2),int (*r),int x,int y,int z);
void matrix_multiply2(int (*m1),int (*m2),int (*r),int x,int y,int z);
int main(void)
{

int m1[3][3]={

{

         2,-6,1 

},

{

3,5,2

},

{

1,-1,3 

}

};

int m2[3][4]={

{

4,-2,-4,-5

},

{

-7,-3,6,7

}

{

-7,-3,6,7

}

};

int r[3][4]={

0

};

int q[3][4],r[3][4];

matrix_multiply1(m1,m2,q,3,3,4);

for(int t=0;t<3;t++)

{

for(int j=0;j<4;j++)

{

printf("%-10d ",q[t][j]);

}

printf("\n");

}

printf("\n"); 

matrix_multiply2(m1,m2,r,3,3,4);

for(int t=0;t<3;t++)

{

for(int j=0;j<4;j++)

{

printf("%-10d ",r[t][j]);

}

printf("\n");

return 0;

}
void matrix_multiply1(int (*m1),int (*m2),int (*r),int x,int y,int z)
{

int num=0,a,b;

int col=0,raw=0;

for(int i=0;i<x;i++)

{

raw=i*y;//行列 

int rawcol=i*z;   

for(int t=0;t<z;t++)

{

num=0; 

for(int j=0;j<y;j++)

{

col=j*z;//行

a=*(m1+raw+j);

b=*(m2+col+t);

num+=a*b;

}

*(r+rawcol+t)=num;

}

}


}
void matrix_multiply2(int (*m1),int (*m2),int (*r),int x,int y,int z)
{

register int *m1p;

register int *m2p;

register int k;

int row,column;

for(row=0;row<x;row++)

{    

for(column=0;column<z;column++)

{

m1p=m1+row*y;

m2p=m2+column;

for(k=0;k<y;k++)

{

*r+=*m1p * *m2p;

m1p+=1;

m2p+=z; 

}

r++;

}

}

输出结果:



0 0