C语言科学计算入门之矩阵乘法的相关计算

2020-01-06 14:06:52王旭
易采站长站为您分析C语言科学计算入门之矩阵乘法的相关计算,文章中还介绍了矩阵相关的斯特拉森算法的实现,需要的朋友可以参考下  

1.矩阵相乘
矩阵相乘应满足的条件: 
(1) 矩阵A的列数必须等于矩阵B的行数,矩阵A与矩阵B才能相乘;
(2) 矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列数;
(3) 矩阵C中第i行第j列的元素等于矩阵A的第i行元素与矩阵B的第j列元素对应乘积之和,即

C语言科学计算入门之矩阵乘法的相关计算

如:

C语言科学计算入门之矩阵乘法的相关计算

则:

C语言科学计算入门之矩阵乘法的相关计算

2. 常用矩阵相乘算法
    用A的第i行分别和B的第j列的各个元素相乘求和,求得C的第i行j列的元素,这种算法中,B的访问是按列进行访问的,代码如下:


void arymul(int a[4][5], int b[5][3], int c[4][3])
{
 int i, j, k;
 int temp;
 for(i = 0; i < 4; i++){
 for(j = 0; j < 3; j++){
  temp = 0;
  for(k = 0; k < 5; k++){
  temp += a[i][k] * b[k][j];
  }
  c[i][j] = temp;
  printf("%d/t", c[i][j]);
 }
 printf("%d/n");
 }
}

3. 改进的算法
    矩阵A、B、C都按行(数据的存储顺序)访问,以提高存储器访问效率,对于A的第i行中,第j列的元素分别和B的第j行的元素相乘,对于B中相同的列k在上述计算过程中求和,从而得到C第i行k列的数据,代码如下:


void arymul1(int a[4][5], int b[5][3], int c[4][3])
{
 int i, j, k;
 int temp[3] = {0};
 for(i = 0; i < 4; i++){
 for(k = 0; k < 3; k ++)
  temp[k] = 0;
 for(j = 0; j < 5; j++){//当前行的每个元素
  for(k = 0; k < 3; k++){
  temp[k] += a[i][j] * b[j][k];
  }
 }
 for(k = 0; k < 3; k++){
  c[i][k] = temp[k];
  printf("%d/t", c[i][k]);
 }
 printf("%d/n");
 }
}