C語言動態二維陣列實現矩陣的相乘
阿新 • • 發佈:2019-02-18
c語言動態二維陣列實現矩陣相乘
- 如何申請動態二維陣列,程式碼如下
該方法是最靈活的,可以任意指定行數和列數
/*
*申請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 .