【问题标题】:How to multiply matrices of different sizes?如何将不同大小的矩阵相乘?
【发布时间】:2022-11-12 03:45:57
【问题描述】:

我正在尝试将不同大小的矩阵相乘。通常,如果矩阵的大小相同,您会使用 2 个 for 循环,但是大小不同的矩阵呢?

int main(int argc, char const *argv[]) {
  int mat1[2][3] ={{1,2,3},
                  {4,5,6},
                  };
  int mat2[3][2] = {{1,2},
                    {3,4},
                    {6,5}
                   };

int *pointerToMat1 = &mat1[0][0];
int *pointerToMat2 = &mat2[0][0];



  return 0;
}

我正在考虑使用指针,但我迷路了。上面的例子只是为了测试函数,一般来说 matrixProduct 应该适用于任何大小的矩阵,只要数学规则成立。

【问题讨论】:

  • 我认为您可以使用 for 循环但是我需要将什么作为约束?
  • 当然还有两个循环。你会如何在纸上做乘法?

标签: arrays c pointers matrix


【解决方案1】:

好吧..矩阵乘法的公式非常简单:

Multiplying A(MxN) and B(NxM) gives C(MxM):

C[i,j] = sum ( A[i,k]*B[k,j] k = 0..N ) ; i,j=0..M

所以用你的代码我会做:

#include <stdio.h>

int main()
{
      int mat1[2][3] ={{1,2,3},
                  {4,5,6},
                  };
      int mat2[3][2] = {{1,2},
                        {3,4},
                        {6,5}
                       };
    
    int *pointerToMat1 = &mat1[0][0];
    int *pointerToMat2 = &mat2[0][0];
    
    
    int C[2][2];
    for ( int i=0; i<2; i++) {
        for( int j=0;j<2;j++ ) {
           C[i][j] = 0;
           for( int k=0;k<3;k++ ) {
               printf("%dx%d=%d
",mat1[i][k],mat2[k][j],mat1[i][k]*mat2[k][j]);
              C[i][j] += mat1[i][k]*mat2[k][j];
           } 
        }
    }
    
    printf("%d %d %d %d",C[0][0],C[0][1],C[1][0],C[1][1]);
    
}

【讨论】:

  • 如果 k, 尚未声明,您如何访问 C[i][k]?另外,如果我们想在 for 循环中使用变量作为约束,我的意思是:``` for( int j=0;j<variable;j++ )```
  • 有一个错字,应该是C[i][j]
  • 是的,您可以使用变量,但限制是由矩阵的大小定义的,因此您可以使用适合您的程序的内容。如果必须动态调整矩阵大小,则将变量作为 for 循环的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
相关资源
最近更新 更多