动态规划之矩阵连乘问题的两个矩阵相乘

动态规划之矩阵连乘问题的两个矩阵相乘

  1. 矩阵连乘简介
  2. 详细例子以及解析
  3. 图片链接和图片上传
  4. 代码
  5. 测试结果

矩阵连乘简介

  1. 给定n个矩阵{A1,A2,…,An},其中,Ai与Ai+1是可乘的,i=1,2,….n-1。
  2. 由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有不同的计算次序。
  3. 矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。
  4. 若A是一个p×q矩阵,B是一个q×r矩阵,则其乘积C=AB是一个p×r矩阵。在上述计算C的标准算法中,主要计算量在3重循环,总共需要p×q×r次数乘。

详细例子以及解析

两个矩阵相乘计算:
动态规划之矩阵连乘问题的两个矩阵相乘_第1张图片

下面举具体例子:
动态规划之矩阵连乘问题的两个矩阵相乘_第2张图片

首先定义一个数组A[MAX][MAX]用来存储一个矩阵的数值。
再定义一个数组B[MAX][MAX]用来存储另一个矩阵的数值。
最后再定义一个数组C[MAX][MAX]用来存储两个矩阵相乘的结果。
动态规划之矩阵连乘问题的两个矩阵相乘_第3张图片
前面提到这个代码需要三重循环:

  1. 第一重是矩阵相乘中的A的数据,因为A数组是一行一行与B数组相乘的,所以判断条件是A的行数
  2. 第二重是矩阵相乘中的B的数据,因为B数组是一列一列与A数组相乘的,所以判断条件是B的列数
  3. 第三重是根据列出的数据得出的规律,由上图可以看出结果是由两部分相加得到的。因此可一在第三重循环前解决前一部分的问题,在第三重循环里面解决第二部分的问题。

代码块

#include
#include
#define MAX 100
void MatrixMultiply(int a[][MAX], int b[][MAX], int c[][MAX], int ra, int ca, int rb, int cb)
{
    int i, j, k;
    int sum = 0;
    if (ca != rb)   //如果a的列数不等于b的行数就不能相乘
    {
        printf("ERROR!");
    }
    for (i = 0; i < ra; i++) //a是一行一行与b相乘的
    {
        for (j = 0; j < cb; j++)//b是一行一行与a相乘的
        {
            sum = a[i][0] * b[0][j];
            for (k = 1; k < ca; k++)
            {
                sum += a[i][k] * b[k][j];//前面的解决的是第一部分的a的列数为0的,b的行数为0的
            }   //这行代码解决的是后一部分a的列数大于0的,b的行数大于0的
            c[i][j] = sum;
        }

    }
}

int main(void)
{
    int i, j;
    int a[MAX][MAX];
    int b[MAX][MAX];
    int c[MAX][MAX];
    int ra, ca;
    puts("请输入矩阵A的行与列:");
    scanf("%d%d", &ra, &ca);
    int rb, cb;
    puts("请输入矩阵B的行与列:");
    scanf("%d%d", &rb, &cb);
    puts("请输入矩阵A的具体数据:");
    for (i = 0; i < ra; i++)
    {
        for (j = 0; j < ca; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    puts("请输入矩阵B的具体数据;");
    for (i = 0; i < rb; i++)
    {
        for (j = 0; j < cb; j++)
        {
            scanf("%d", &b[i][j]);
        }
    }
    MatrixMultiply(a, b, c, ra, ca, rb, cb);
    printf("矩阵相乘的结果:\n");
    for (i = 0; i < ra; i++)
    {
        for (j = 0; j < cb; j++)
        {
            printf("%d ", c[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    system("pause");
    return 0;
}

测试结果

动态规划之矩阵连乘问题的两个矩阵相乘_第4张图片

你可能感兴趣的:(算法)