我波紋管連接矩陣乘法的代碼與動態內存的任何適當的順序分配
爲了完整性我用於矩陣乘法3種不同的方法:一種功能double** multMatrixpf
(參見等效功能的Fortran /帕斯卡)和兩個子程序/程序(的Fortran /帕斯卡等),其中,由第一void multMatrixp
需要allocate_mem(&c,ro1,co2)
外側且第二子程序void multMatrixpp
矩陣c1
被分配在子程序中。所有這三種方法都給出了相同的結果。
以及我使用不同的方法初始化數組。
#include <stdio.h>
#include <stdlib.h>
void allocate_mem(double*** arr, int rows, int cols);
void deallocate_mem(double*** arr, int n);
double** readMatrixf(int rows, int cols);
void readMatrix(double ***a, int rows,int cols);
void printMatrix(double** a, int rows, int cols);
void printMatrixE(double** a, int rows, int cols);
void multMatrixp(double **A, double **B, double **C,int r1,int c1,int r2,int c2);
void multMatrixpp(double **A, double **B, double ***C,int ro1,int co1,int ro2,int co2);
double** multMatrixpf(double **A, double **B, int ro1,int co1,int ro2,int co2);
//______________________________________________________________________________
int main()
{
int ro1, co1, ro2, co2;
double **a1, **b1, **c1;
ro1=2; co1=3;
ro2=3; co2=4;
printf("Ex1:__________________________________________________"
"__________________________ \n");
double (*(a[])) = {
(double[]) { 1, 3, 5},
(double[]) {2, 4, 0}};
double (*(b[])) = {
(double[]) {6, 2, 4, 8},
(double[]) {1, 7, 0, 9},
(double[]) {0, 3, 5, 1}};
printMatrix(a,ro1,co1);
printMatrix(b,ro2,co2);
printf("MatMult \n");
double **c;
allocate_mem(&c,ro1,co2);
multMatrixp(a, b, c, ro1, co1, ro2, co2);
printMatrix(c,ro1,co2);
printMatrixE(c,ro1,co2);
deallocate_mem(&c,ro1);
printf("Ex2:__________________________________________________"
"__________________________ \n");
scanf("%d%d", &ro1, &co1);
readMatrix(&a1,ro1,co1);
printMatrix(a1,ro1,co1);
//deallocate_mem(&a1,ro1);
//printMatrix(a1,ro1,co1);
scanf("%d%d", &ro2, &co2);
readMatrix(&b1,ro2,co2);
printMatrix(b1,ro2,co2);
printf("MatMult \n");
multMatrixpp(a1, b1, &c1, ro1, co1, ro2, co2);
printMatrix(c1,ro1,co2);
printMatrixE(c1,ro1,co2);
deallocate_mem(&a1,ro1);
deallocate_mem(&b1,ro2);
deallocate_mem(&c1,ro1);
printf("Ex3:__________________________________________________"
"__________________________ \n");
scanf("%d%d", &ro1, &co1);
a1=readMatrixf(ro1,co1);
printMatrix(a1,ro1,co1);
//deallocate_mem(&a1,ro1);
//printMatrix(a1,ro1,co1);
scanf("%d%d", &ro2, &co2);
b1=readMatrixf(ro2,co2);
printMatrix(b1,ro2,co2);
printf("MatMult \n");
c1=multMatrixpf(a1, b1, ro1, co1, ro2, co2);
printMatrix(c1,ro1,co2);
printMatrixE(c1,ro1,co2);
deallocate_mem(&a1,ro1);
deallocate_mem(&b1,ro2);
deallocate_mem(&c1,ro1);
return 0;
}
//______________________________________________________________________________
void allocate_mem(double*** arr, int rows, int cols)
{
int i;
*arr = (double**)malloc(rows*sizeof(double*));
for(i=0; i<rows; i++)
(*arr)[i] = (double*)malloc(cols*sizeof(double));
}
//______________________________________________________________________________
void deallocate_mem(double*** arr, int rows){
int i;
for (i = 0; i < rows; i++)
free((*arr)[i]);
free(*arr);
}
//______________________________________________________________________________
double** readMatrixf(int rows, int cols)
{
double **a; // Define a local pointer to keep rest of the code intact
int i, j;
a= (double**) malloc(rows*sizeof(double*));
for(i=0;i<rows;i++)
a[i]=(double*)malloc(cols*sizeof(double));
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
scanf("%lf",&a[i][j]);
return a;
}
//______________________________________________________________________________
void readMatrix(double ***a, int rows,int cols)
{
int i, j;
*a= (double**) malloc(rows*sizeof(double*));
for(i=0;i<rows;i++)
(*a)[i]=(double*)malloc(cols*sizeof(double));
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
scanf("%lf",&(*a)[i][j]);
}
//______________________________________________________________________________
void printMatrix(double** a, int rows, int cols)
{
int i, j;
printf("Matrix[%d][%d]\n",rows,cols);
for(i=0;i<rows;i++){
for(j=0;j<cols;j++)
printf("%8.3lf ",a[i][j]);
printf("\n");
}
printf("\n");
}
//______________________________________________________________________________
void printMatrixE(double** a, int rows, int cols)
{
int i, j;
printf("Matrix[%d][%d]\n",rows,cols);
for(i=0;i<rows;i++){
for(j=0;j<cols;j++)
printf("%9.2e ",a[i][j]);
printf("\n");
}
printf("\n");
}
//______________________________________________________________________________
void multMatrixp(double **A, double **B, double **C,int ro1,int co1,int ro2,int co2)
{
int i, j, k;
for(i = 0; i < ro1; i++) {
for(j = 0; j < co2; j++) {
C[i][j] = 0;
for(k = 0; k < co1; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
//______________________________________________________________________________
void multMatrixpp(double **A, double **B, double ***C,int ro1,int co1,int ro2,int co2)
{
int i, j, k;
*C= (double**) malloc(ro1*sizeof(double*));
for(i=0;i<ro1;i++)
(*C)[i]=(double*)malloc(co2*sizeof(double));
for(i = 0; i < ro1; i++) {
for(j = 0; j < co2; j++) {
(*C)[i][j] = 0.0;
for(k = 0; k < co1; k++) {
(*C)[i][j] += A[i][k] * B[k][j];
}
}
}
}
//______________________________________________________________________________
double** multMatrixpf(double **A, double **B, int ro1,int co1,int ro2,int co2)
{
int i, j, k;
double **C;
C= (double**) malloc(ro1*sizeof(double*));
for(i=0;i<ro1;i++)
C[i]=(double*)malloc(co2*sizeof(double));
for(i = 0; i < ro1; i++) {
for(j = 0; j < co2; j++) {
C[i][j] = 0.0;
for(k = 0; k < co1; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
return C;
}
其中作爲輸入矩陣我們有in.txt
4 4
1 1 1 1
2 4 8 16
3 9 27 81
4 16 64 256
4 3
4.0 -3.0 4.0
-13.0 19.0 -7.0
3.0 -2.0 7.0
-1.0 1.0 -1.0
3 4
1 2 -2 0
-3 4 7 2
6 0 3 1
4 2
-1 3
0 9
1 -11
4 -5
在類似Unix的CMMD線執行命令:
$時間./Matmult < in.txt> out.txt
你得到輸出
out.txt
Ex1:____________________________________________________________________________
Matrix[2][3]
1.000 3.000 5.000
2.000 4.000 0.000
Matrix[3][4]
6.000 2.000 4.000 8.000
1.000 7.000 0.000 9.000
0.000 3.000 5.000 1.000
MatMult
Matrix[2][4]
9.000 38.000 29.000 40.000
16.000 32.000 8.000 52.000
Matrix[2][4]
9.00e+00 3.80e+01 2.90e+01 4.00e+01
1.60e+01 3.20e+01 8.00e+00 5.20e+01
Ex2:____________________________________________________________________________
Matrix[4][4]
1.000 1.000 1.000 1.000
2.000 4.000 8.000 16.000
3.000 9.000 27.000 81.000
4.000 16.000 64.000 256.000
Matrix[4][3]
4.000 -3.000 4.000
-13.000 19.000 -7.000
3.000 -2.000 7.000
-1.000 1.000 -1.000
MatMult
Matrix[4][3]
-7.000 15.000 3.000
-36.000 70.000 20.000
-105.000 189.000 57.000
-256.000 420.000 96.000
Matrix[4][3]
-7.00e+00 1.50e+01 3.00e+00
-3.60e+01 7.00e+01 2.00e+01
-1.05e+02 1.89e+02 5.70e+01
-2.56e+02 4.20e+02 9.60e+01
Ex3:____________________________________________________________________________
Matrix[3][4]
1.000 2.000 -2.000 0.000
-3.000 4.000 7.000 2.000
6.000 0.000 3.000 1.000
Matrix[4][2]
-1.000 3.000
0.000 9.000
1.000 -11.000
4.000 -5.000
MatMult
Matrix[3][2]
-3.000 43.000
18.000 -60.000
1.000 -20.000
Matrix[3][2]
-3.00e+00 4.30e+01
1.80e+01 -6.00e+01
1.00e+00 -2.00e+01
從我觸摸C開始已經很長時間了。但是你確定scanf是否需要一個&?他們只是指針而已? – Ritikesh
'scanf's在這裏可以。 –
是Ritikesh,我在這裏訪問數組元素單獨這就是爲什麼我需要把與在scanf ... –