C和指针 学习(四) 第八章习题 矩阵乘法
如果A是x行,y列的矩阵,B是y行,z列的矩阵,求A和B矩阵的乘法
void matrix_multiply(int *m1, int *m2, int *r, int x, int y, int z);
注意:
1、二维矩阵无法作为mat[][]的形参传递给矩阵, 只有两种形式 (*mat)[10]或者mat[][10],很不方便,因此可以将二维数组转换为指针本质传递 *mat;
实现方法
#include <stdio.h>
void matrix_multiply_1(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;
for(row = 0; row < x; row++){
for(column = 0; column < z; column++){
m1p = m1 + row*y;
m2p = m2 + column;
*r = 0;
for(k = 0; k < y; k++){
*r += *m1p * *m2p;
m1p += 1;
m2p += z;
}
r++;
}
}
}
void matrix_multiply_2(int m1[], int m2[], int *r, int x, int y, int z){
for(int row = 0; row < x; row++){
for(int column = 0; column < z; column++){
r[row * z + column] = 0;
for(int k = 0; k < y; k++){
r[row * z + column] += m1[row * y + k] * m2[k*z +column];
}
}
}
}
void matrix_multiply_3(int *m1, int *m2, int *r, int x, int y, int z){
for(int row = 0; row < x; row++){
for(int column = 0; column < z; column++){
r[row * z + column] = 0;
for(int k = 0; k < y; k++){
r[row * z + column] += m1[row * y + k] * m2[k*z +column];
}
}
}
}
void print_matrix(int *m, int x, int y){
for(int row = 0; row < x; row++){
for(int column = 0; column < y; column++){
printf("%d ",m[row * y + column]);
}
printf("\n");
}
}
int main(){
int a[2][2] = {{-1, 1}, {1, 1}};
int b[2][2] = {{-1, 1}, {1, 1}};
int c[2][2];
print_matrix(*a, 2, 2);
print_matrix(*b, 2, 2);
matrix_multiply_1(*a, *b, *c, 2 ,2 ,2);
print_matrix(*c, 2, 2);
matrix_multiply_2(*a, *b, *c, 2 ,2 ,2);
print_matrix(*c, 2, 2);
matrix_multiply_3(*a, *b, *c, 2 ,2 ,2);
print_matrix(*c, 2, 2);
}
浙公网安备 33010602011771号