//Author:dengjin_CN
//Time:12:06 2009-10-14
#include<stdio.h>
#include<stdlib.h>
/*输入的两个矩阵第一个存储在m1中,第二个存储在m2中,结
果保存在result中,第一个矩阵为x行y列,第二个矩阵为y行z列*/
void matrix_multiply(int *m1,int *m2,int *result,int x,int y,int z);
int main(void){
int result[6] = {0};//此数组的维数等于x*z,每次运行需要修改
int m1[] = {1,3,2,4,5,2,3,4,3,2,3,4};
int m2[] = {2,3,1,6,0,7,8,0};
//For testing:
matrix_multiply(m1,m2,result,3,4,2);
return EXIT_SUCCESS;
}
void
matrix_multiply(int *m1,int *m2,int *result,int x,int y,int z){
int l_m1[x][y],l_m2[y][z],l_result[y][x*z];//把原来的一维数组转换到相应行列的二维数组,方便运算
int i=0,j=0,k=0;
int loop = 0;
int part_of_result[y][x*z];//多次运算值
int (*p_part_of_result)[x*z] = &part_of_result[0];//用指针运算,以下凡是p_part_of_result均可以直接换成part_of_result
int *p_result = result;
//converting
for(i=0;i<x;i++)
for(j=0;j<y;j++)
l_m1[i][j] = *m1++;
//converting
for(i=0;i<y;i++)
for(j=0;j<z;j++)
l_m2[i][j] = *m2++;
/*算法部分:
假定有如下两个矩阵相乘
[a b c d] [A B]
[e f g h] X [C D]
[i j k l] [E F]
[G H]
把第一个矩阵的每一列的每一个值均与第二个矩阵的对应行相乘,比如
a*A+a*B+e*A+e*B+i*A+i*B存在第一个part_of_result中,相应的
b*C+b*D+f*C+f*D+j*C+j*D存在第二个part_of_result中,以此类推(一共y次)
.
.
.
d*G+d*H+h*G+h*G+l*G+l*H存在最后一个part_of_result中,然后把对应的列相加存到result中,即
a*A+b*C+...+d*G存在result[0]
a*B+b*D+...+d*H存在result[1],以此类推
存在result中的值即为最后结果,格式化输出
*/
while(loop < y){
k = 0;
for(i=0;i<x;i++)
for(j=0;j<z;j++){
p_part_of_result[loop][k] = l_m1[i][loop]*l_m2[loop][j];
k++;
}
loop++;
}
for(i=0;i<x*z;i++){
for(j=0;j<y;j++)
*p_result += p_part_of_result[j][i];
p_result++;
}
//output format
for(i=0;i<x;i++){
putchar('[');
for(j=0;j<z;j++)
printf("%4d ",*result++);
putchar(']');
putchar('\n');
}
}
|