1. 程式人生 > >C語言動態二維陣列實現矩陣的相乘

C語言動態二維陣列實現矩陣的相乘

c語言動態二維陣列實現矩陣相乘


  1. 如何申請動態二維陣列,程式碼如下
該方法是最靈活的,可以任意指定行數和列數
    /*
    *申請a陣列的記憶體*
    */

    /*先申請每一行指標的記憶體*/
    a = (int **)malloc(sizeof(int *)*a_row);
    /*申請各行記憶體*/
    for(i=0; i<a_row; i++) {
        *(a+i)=(int *)malloc(sizeof(int)*a_column);
    }

2 . 動態陣列的釋放,必須按步驟來釋放,先釋放指標的指標記憶體,接著釋放指標的記憶體。

free(a);
    for(i=0; i<a_column; i++) {
        free(*(a+i));
    }

3 . 矩陣的相乘演算法,a_row是矩陣a的行數,b_row是矩陣b的行數,a_column,b_column是列數,使用一個c矩陣來儲存結果。

    /*初始化*/
    for(i=0; i<a_row; i++) {
        for(j=0; j<b_column; j++) {
            c[i][j]=0;
        }
    }
    for(i=0; i<a_row; i++) {
        for
(j=0; j<b_column; j++) { for(k=0; k<a_row; k++) { c[i][j]+=a[i][k]*b[k][j]; } } }

4 . 完整的程式碼

#include<stdio.h>
#include<stdlib.h>
int main() {
    /*a矩陣的行數*/
    int a_row;
    /*a矩陣的列數*/
    int a_column;
    /*b矩陣的行數*/
    int b_row;
    /*b矩陣的列數*/
int b_column; /*提示輸入資料*/ printf("請輸入a_row\n"); scanf("%d",&a_row); printf("請輸入a_column\n"); scanf("%d",&a_column); printf("請輸入b_row\n"); scanf("%d",&b_row); printf("請輸入b_column\n"); scanf("%d",&b_column); if(a_row!=b_column){ printf("您輸入的陣列不符合要求!"); exit(0); } /*定義迴圈需要的變數*/ int i,j,k; /*定義申請記憶體需要的指標*/ int **a=NULL,**b=NULL,**c=NULL; /* *申請a陣列的記憶體* */ /*先申請每一行指標的記憶體*/ a = (int **)malloc(sizeof(int *)*a_row); /*申請各行記憶體*/ for(i=0; i<a_row; i++) { *(a+i)=(int *)malloc(sizeof(int)*a_column); } /* *申請b陣列的記憶體* */ /*先申請每一行指標的記憶體*/ b = (int **)malloc(sizeof(int *)*b_row); /*申請各行記憶體*/ for(i=0; i<a_row; i++) { *(b+i)=(int *)malloc(sizeof(int)*b_column); } /* *申請c陣列的記憶體* */ /*先申請每一行指標的記憶體*/ c = (int **)malloc(sizeof(int *)*a_row); /*申請各行記憶體*/ for(i=0; i<a_row; i++) { *(c+i)=(int *)malloc(sizeof(int)*b_column); } /*輸入a矩陣的資料*/ printf("輸入矩陣a:\n"); for(i=0; i<a_row; i++) { for(j=0; j<a_column; j++) { scanf("%d",&a[i][j]); } } /*輸入b矩陣的資料*/ printf("輸入矩陣b:\n"); for(i=0; i<b_row; i++) { for(j=0; j<b_column; j++) { scanf("%d",&b[i][j]); } } /* *計算結果矩陣c */ /*初始化*/ for(i=0; i<a_row; i++) { for(j=0; j<b_column; j++) { c[i][j]=0; } } for(i=0; i<a_row; i++) { for(j=0; j<b_column; j++) { for(k=0; k<a_row; k++) { c[i][j]+=a[i][k]*b[k][j]; } } } /*輸出結果矩陣C*/ printf("結果是:\n"); for(i=0; i<a_row; i++) { for(j=0; j<b_column; j++) { printf("%d ",c[i][j]); } printf("\n"); } /* *釋放記憶體 */ free(a); for(i=0; i<a_column; i++) { free(*(a+i)); } free(b); for(i=0; i<b_column; i++) { free(*(b+i)); } free(c); for(i=0; i<b_column; i++) { free(*(c+i)); } return 0; }

5 .
執行截圖