[C/C++] 矩陣相乘輸出為矩陣表示法
963 字
5 分鐘
[C/C++] 矩陣相乘輸出為矩陣表示法
【輸入】
兩組矩陣,大小需為M×N及N×P
【輸出】
- 兩組矩陣轉換成表示式兩個矩陣相乘後的矩陣和表示式
【完整程式碼】
#include#includeusing 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 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 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 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 col; j++) for(int k = 0; k 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 row; i++) for(int j = 0; j 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 row; i++){ for(int j = 0; j col; j++) printf("%2d ", matrix->elements[i][j]); putchar('\n'); }}測試資料:
請輸入矩陣A的大小(m*n請輸入 m n):2 3請輸入矩陣A的元素 :0 6 040 0 0 0矩陣A的表示式: 列 行 元素 2 3 2 0 1 6 1 0 4====================請輸入矩陣B的大小(m*n請輸入 m n):3 2請輸入矩陣B的元素 :0 20 02 0矩陣B的表示式: 列 行 元素 3 2 2 0 1 2 2 0 2====================矩陣C: 0 0 0 8矩陣C的表示式: 列 行 元素 2 2 1 1 1 8文章分享
如果這篇文章對你有幫助,歡迎分享給更多人!
[C/C++] 矩陣相乘輸出為矩陣表示法
https://linziyou.info/posts/2019-10-07-c-c-矩陣相乘輸出為矩陣表示法/ 最後更新於 2019-10-07,距今已過 2338 天
部分內容可能已過時