[C/C++] 矩陣相乘輸出為矩陣表示法

【輸入】

兩組矩陣,大小需為M×N及N×P

【輸出】

  1. 兩組矩陣轉換成表示式
  2. 兩個矩陣相乘後的矩陣和表示式

【完整程式碼】

#include <stdio.h>
#include <stdlib.h>
using namespace std; 

//定義一個串列結構,用來存表示式的每一列
typedef struct MatrixRep {
    int row, col, value;
    struct MatrixRep *next;
} MatrixRep;

//定義一個矩陣結構,用來矩陣的列、欄及一個二維陣列
typedef struct Matrix {
    int row, col, **elements;
} Matrix;

void inputMatrix(char *matrixName, Matrix *matrix);      //輸入矩陣
void matrixMultiplied(Matrix *A, Matrix *B, Matrix *C);  //矩陣相乘
void matrixToRep(Matrix *from, MatrixRep **to);          //矩陣轉表示式
void printMatrixRep(char *matrixName, MatrixRep *mRep);  //印出表示式
void printMatrix(char *matrixName, Matrix *matrix);      //印出矩陣

int main(void) {
    //A、B、C為矩陣;  *matrixRepA、B、C為矩陣表示式
    MatrixRep *matrixRepA, *matrixRepB, *matrixRepC;
    Matrix A, B, C;
    
    //輸入兩組矩陣
    inputMatrix("A", &A);
    matrixToRep(&A, &matrixRepA);        //矩陣A轉表示式
    printMatrixRep("A", matrixRepA);     //印出表示式A,避免表示式A的指向被改掉,故傳值
    printf("====================\n");
    inputMatrix("B", &B);
    matrixToRep(&B, &matrixRepB);        //矩陣B轉表示式
    printMatrixRep("B", matrixRepB);     //印出表示式B
    printf("====================\n");

    //兩組矩陣相乘存入矩陣C
    if(A.col == B.row)
        matrixMultiplied(&A, &B, &C);
    else{
        printf("兩個矩陣無法相乘\n");
        system("pause");
        return 0;
    }
    
    //矩陣C轉換為表示式並輸出
    matrixToRep(&C, &matrixRepC);     //矩陣C轉表示式
    printMatrix("C", &C);             //印出矩陣C
    printMatrixRep("C", matrixRepC);  //印出表示式C
    
    system("pause");
    return 0; 
}

/*-----輸入矩陣-----*/
void inputMatrix(char *matrixName, Matrix *matrix){
    //輸入矩陣大小
    printf("請輸入矩陣%s的大小(m*n請輸入 m n):", matrixName);
	scanf("%d%d", &matrix->row, &matrix->col);

    //輸入矩陣元素
	printf("請輸入矩陣%s的元素 :\n", matrixName);
    matrix->elements = new int*[matrix->row];        //動態配置陣列ROW大小
    //等同C的 matrix->elements = (int **)malloc(sizeof(int*) * matrix->row);

	for (int i = 0; i < matrix->row; i++) {
        matrix->elements[i] = new int[matrix->col];  //動態配置陣列COL大小
        //等同C的 matrix->elements[i] = (int *)malloc(sizeof(int) * matrix->col);

		for (int j = 0; j < matrix->col; j++)
			scanf("%d", &matrix->elements[i][j]);
	}
}

/*-----矩陣相乘-----*/
void matrixMultiplied(Matrix *A, Matrix *B, Matrix *C){
    //存矩陣C的ROW、COL
    C->row = A->row;
    C->col = B->col;
    
    //存相乘存入矩陣C
    C->elements = new int*[C->row];           //動態配置陣列ROW大小
    //等同C的 C->elements = (int **)malloc(sizeof(int*) * C->row);
    
    for(int i = 0; i < C->row; i++){
        C->elements[i] = new int[C->col]{0};  //動態配置陣列COL大小 //給定 C[i,j] 初值0
        //等同C的 C->elements[i] = (int *)malloc(sizeof(int) * C->col);  C->elements[i][j] = 0;

        for(int j = 0; j < C->col; j++)                
            for(int k = 0; k < A->col; k++)
                C->elements[i][j] += A->elements[i][k] * B->elements[k][j];
                // 矩陣C[i,j] = 矩陣A[i,k] * 矩陣B[k,j] for k in A.COL
    }
}

/*-----矩陣轉表示式-----*/
void matrixToRep(Matrix *from, MatrixRep **to){
    //宣告並指定Rep第一列的ROW、COL、COUNT資訊;  並將current指向第一列:current = *to
    MatrixRep *current;
    current = *to = new MatrixRep{from->row, from->col, 0, NULL};   
    /*等同C的
      current = *to = (MatrixRep *)malloc(sizeof(MatrixRep));
      (*to)->row=from->row; (*to)->col=from->col; (*to)->value=0; (*to)->next=NULL;*/

    //非零元素存入表示式
    for(int i = 0; i < from->row; i++)
        for(int j = 0; j < from->col; j++)
            if(from->elements[i][j] != 0){
                //宣告並指定新一列表示式[i, j, VALUE];  然後表示式鏈結起來;  並將current指向新一列:current = current->next;
                current = current->next = new MatrixRep{i, j, from->elements[i][j], NULL};  
                /*等同C的
                  current = current->next = (MatrixRep *)malloc(sizeof(MatrixRep));
                  current->row=i; current->col=j; current->value=from->elements[i][j]; current->next=NULL;*/

                ((*to)->value)++; //將非零元素個數+1
            }
}

/*-----印出表示式-----*/
void printMatrixRep(char *matrixName, MatrixRep *mRep){
	printf("矩陣%s的表示式:\n 列 行 元素\n", matrixName);
    for(; mRep!=NULL; mRep = mRep->next)
        printf("%2d %2d %2d\n", mRep->row, mRep->col, mRep->value);
}

/*-----印出矩陣-----*/
void printMatrix(char *matrixName, Matrix *matrix){
    printf("矩陣%s:\n", matrixName);
    for(int i = 0; i < matrix->row; i++){
        for(int j = 0; j < matrix->col; j++)
            printf("%2d ", matrix->elements[i][j]);
        putchar('\n');
    }
}
測試資料:

請輸入矩陣A的大小(m*n請輸入 m n):2 3
請輸入矩陣A的元素 :
0 6 0
40 0      0 0
矩陣A的表示式:
 列 行 元素
 2  3  2
 0  1  6
 1  0  4
====================
請輸入矩陣B的大小(m*n請輸入 m n):3 2
請輸入矩陣B的元素 :
0 2
0 0
2 0
矩陣B的表示式:
 列 行 元素
 3  2  2
 0  1  2
 2  0  2
====================
矩陣C:
 0  0 
 0  8 
矩陣C的表示式:
 列 行 元素
 2  2  1
 1  1  8