【輸入】
兩組矩陣,大小需為M×N及N×P
【輸出】
- 兩組矩陣轉換成表示式
- 兩個矩陣相乘後的矩陣和表示式
【完整程式碼】
#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