📜  矩阵乘法 |递归的

📅  最后修改于: 2022-05-13 01:57:24.855000             🧑  作者: Mango

矩阵乘法 |递归的

给定两个矩阵 A 和 B。任务是递归地将矩阵 A 和矩阵 B 相乘。如果矩阵 A 和矩阵 B 不是乘法兼容的,则生成输出“不可能”。
例子 :

Input: A = 12 56
           45 78
       B = 2 6
           5 8
Output: 304 520
        480 894

Input: A = 1 2 3
           4 5 6
           7 8 9
       B = 1 2 3
           4 5 6
           7 8 9

Output: 30  36  42  
        66  81  96  
       102 126 150  

建议先参考Iterative Matrix Multiplication。
首先检查矩阵之间的乘法是否可能。为此,检查第一个矩阵的列数是否等于第二个矩阵的行数。如果两者相等,则继续进行,否则生成输出“不可能”。
在递归矩阵乘法中,我们通过递归调用实现了三个迭代循环。 multiplyMatrix()最内部的递归调用是迭代 k(col1 或 row2)。 multiplyMatrix()的第二个递归调用是更改列,最外面的递归调用是更改行。
下面是递归矩阵乘法代码。

C/C++

// Recursive code for Matrix Multiplication
#include 

const int MAX = 100;

void multiplyMatrixRec(int row1, int col1, int A[][MAX],
                       int row2, int col2, int B[][MAX],
                       int C[][MAX])
{
    // Note that below variables are static
    // i and j are used to know current cell of
    // result matrix C[][]. k is used to know
    // current column number of A[][] and row
    // number of B[][] to be multiplied
    static int i = 0, j = 0, k = 0;

    // If all rows traversed.
    if (i >= row1)
        return;

    // If i < row1
    if (j < col2)
    {
      if (k < col1)
      {
         C[i][j] += A[i][k] * B[k][j];
         k++;

         multiplyMatrixRec(row1, col1, A, row2, col2,
                                               B, C);
      }

      k = 0;
      j++;
      multiplyMatrixRec(row1, col1, A, row2, col2, B, C);
    }

    j = 0;
    i++;
    multiplyMatrixRec(row1, col1, A, row2, col2, B, C);
}

// Function to multiply two matrices A[][] and B[][]
void multiplyMatrix(int row1, int col1, int A[][MAX],
                    int row2, int col2, int B[][MAX])
{
    if (row2 != col1)
    {
        printf("Not Possible\n");
        return;
    }

    int C[MAX][MAX] = {0};

    multiplyMatrixRec(row1, col1, A, row2, col2, B, C);

    // Print the result
    for (int i = 0; i < row1; i++)
    {
        for (int j = 0; j < col2; j++)
            printf("%d  ", C[i][j]);

        printf("\n");
    }
}

// Driven Program
int main()
{
    int A[][MAX] = { {1, 2, 3},
                    {4, 5, 6},
                    {7, 8, 9}};

    int B[][MAX] = { {1, 2, 3},
                    {4, 5, 6},
                    {7, 8, 9} };

    int row1 = 3, col1 = 3, row2 = 3, col2 = 3;
    multiplyMatrix(row1, col1, A, row2, col2, B);

    return 0;
}
Java
// Java recursive code for Matrix Multiplication
 
class GFG
{
    public static int MAX = 100;
     
    // Note that below variables are static
    // i and j are used to know current cell of
    // result matrix C[][]. k is used to know
    // current column number of A[][] and row
    // number of B[][] to be multiplied
    public static int i = 0, j = 0, k = 0;
     
    static void multiplyMatrixRec(int row1, int col1, int A[][],
                       int row2, int col2, int B[][],
                       int C[][])
    {
        // If all rows traversed
        if (i >= row1)
            return;
  
        // If i < row1
        if (j < col2)
        {
            if (k < col1)
            {
                C[i][j] += A[i][k] * B[k][j];
                k++;
  
                multiplyMatrixRec(row1, col1, A, row2, col2, B, C);
            }
  
            k = 0;
            j++;
            multiplyMatrixRec(row1, col1, A, row2, col2, B, C);
        }
  
        j = 0;
        i++;
        multiplyMatrixRec(row1, col1, A, row2, col2, B, C);
    }
  
    // Function to multiply two matrices A[][] and B[][]
    static void multiplyMatrix(int row1, int col1, int A[][],
                    int row2, int col2, int B[][])
    {
        if (row2 != col1)
        {
            System.out.println("Not Possible\n");
            return;
        }
  
        int[][] C = new int[MAX][MAX];
  
        multiplyMatrixRec(row1, col1, A, row2, col2, B, C);
  
        // Print the result
        for (int i = 0; i < row1; i++)
        {
            for (int j = 0; j < col2; j++)
                System.out.print(C[i][j]+" ");
  
            System.out.println();
        }
    }
     
    // driver program
    public static void main (String[] args)
    {
        int row1 = 3, col1 = 3, row2 = 3, col2 = 3;
        int A[][] = { {1, 2, 3},
                      {4, 5, 6},
                      {7, 8, 9}};
  
        int B[][] = { {1, 2, 3},
                      {4, 5, 6},
                      {7, 8, 9} };
  
        multiplyMatrix(row1, col1, A, row2, col2, B);
    }
}
 
// Contributed by Pramod Kumar


Python3
# Recursive code for Matrix Multiplication
MAX = 100
i = 0
j = 0
k = 0
 
def multiplyMatrixRec(row1, col1, A,
                      row2, col2, B, C):
                           
    # Note that below variables are static
    # i and j are used to know current cell of
    # result matrix C[][]. k is used to know
    # current column number of A[][] and row
    # number of B[][] to be multiplied
    global i
    global j
    global k
     
    # If all rows traversed.
    if (i >= row1):
        return
         
    # If i < row1
    if (j < col2):
        if (k < col1):
            C[i][j] += A[i][k] * B[k][j]
            k += 1
            multiplyMatrixRec(row1, col1, A,
                              row2, col2,B, C)
 
        k = 0
        j += 1
        multiplyMatrixRec(row1, col1, A,
                          row2, col2, B, C)
 
    j = 0
    i += 1
    multiplyMatrixRec(row1, col1, A,
                      row2, col2, B, C)
 
# Function to multiply two matrices
# A[][] and B[][]
def multiplyMatrix(row1, col1, A, row2, col2, B):
    if (row2 != col1):
        print("Not Possible")
        return
 
    C = [[0 for i in range(MAX)]
            for i in range(MAX)]
    multiplyMatrixRec(row1, col1, A,
                      row2, col2, B, C)
     
    # Print the result
    for i in range(row1):
        for j in range(col2):
            print( C[i][j], end = " ")
        print()
 
# Driver Code
A = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]
B = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]
 
row1 = 3
col1 = 3
row2 = 3
col2 = 3
multiplyMatrix(row1, col1, A, row2, col2, B)
 
# This code is contributed by sahilshelangia


C#
// C# recursive code for
// Matrix Multiplication
using System;
 
class GFG
{
    public static int MAX = 100;
     
    // Note that below variables
    // are static i and j are used
    // to know current cell of result
    // matrix C[][]. k is used to
    // know current column number of
    // A[][] and row number of B[][]
    // to be multiplied
    public static int i = 0, j = 0, k = 0;
     
    static void multiplyMatrixRec(int row1, int col1,
                                  int [,]A, int row2,
                                  int col2, int [,]B,
                                  int [,]C)
    {
        // If all rows traversed
        if (i >= row1)
            return;
 
        // If i < row1
        if (j < col2)
        {
            if (k < col1)
            {
                C[i, j] += A[i, k] * B[k, j];
                k++;
 
                multiplyMatrixRec(row1, col1, A,
                                  row2, col2, B, C);
            }
 
            k = 0;
            j++;
            multiplyMatrixRec(row1, col1, A,
                              row2, col2, B, C);
        }
 
        j = 0;
        i++;
        multiplyMatrixRec(row1, col1, A,
                          row2, col2, B, C);
    }
 
    // Function to multiply two
    // matrices A[][] and B[][]
    static void multiplyMatrix(int row1, int col1,
                               int [,]A, int row2,
                               int col2, int [,]B)
    {
        if (row2 != col1)
        {
            Console.WriteLine("Not Possible\n");
            return;
        }
 
        int[,]C = new int[MAX, MAX];
 
        multiplyMatrixRec(row1, col1, A,
                          row2, col2, B, C);
 
        // Print the result
        for (int i = 0; i < row1; i++)
        {
            for (int j = 0; j < col2; j++)
                Console.Write(C[i, j] + " ");
 
            Console.WriteLine();
        }
    }
     
    // Driver Code
    static public void Main ()
    {
        int row1 = 3, col1 = 3,
            row2 = 3, col2 = 3;
        int [,]A = {{1, 2, 3},
                    {4, 5, 6},
                    {7, 8, 9}};
 
        int [,]B = {{1, 2, 3},
                    {4, 5, 6},
                    {7, 8, 9}};
 
        multiplyMatrix(row1, col1, A,
                       row2, col2, B);
    }
}
 
// This code is contributed by m_kit


Javascript


输出 :

30  36  42  
66  81  96  
102  126  150