合計 昨日 今日

行列とベクトルの積の計算

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: ben
[URL]
Date: 2017年12月07日(木) 13:54
No: 1
(OFFLINE)

 行列とベクトルの積の計算

初投稿、C言語初心者です。環境はMacのXcodeを使っています。
行列とベクトルの積をとってベクトルを計算する(b=Ax)というプログラムを作ろうとしているのですがうまくいかなくて困っています。
Aとxをtxt形式のファイルから読み込み配列にそれぞれ格納するところまではうまくいきましたが、いざbを計算して表示しようとするとうまくいきません。
エラーにThread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)と出るので、確保してない領域に書き込もうとしているから、のように思うのですが…さっぱりわかりません。
どうしたら解決できますでしょうか。ご教授ください。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <stdio.h>
#include <stdlib.h>
 
double **dmatrix(int, int);
double *dvector(int n);
void mul_A3x(double (*A)[3], double *x, double (*b));
 
 
int main(void) {
    FILE *fp1;
    FILE *fp2;
    char buf[40];
    int nrow, ncol, num;
    double **matrixA;
    double *vecx;
    double *vecb;
   
    fp1 = fopen("A.txt", "r");
    if(fp1 == NULL) {
        printf("file not open!\n");
        return -1;
    }
   
    fp2 = fopen("x.txt", "r");
    if(fp2 == NULL) {
        printf("file not open!\n");
        return -1;
    }
 //matrixAの行と列の入力
    printf("# of A_rows: ");
    fgets(buf, sizeof(buf), stdin);
    sscanf(buf, "%d", &nrow);
    printf("# of A_columns: ");
    fgets(buf, sizeof(buf), stdin);
    sscanf(buf, "%d", &ncol);
   
    //matrixAの動的確保
    printf("matrixA allocation\n");
    matrixA = dmatrix(nrow, ncol);
    //matrixAのファイルからの読み込みと初期化
    printf("matrixA=\n");
    for (int i=0; i < nrow; i++){
        for (int j=0; j < ncol; j++){
            fscanf(fp1, "%lf", &matrixA[i][j]);
            printf("%.2lf ", matrixA[i][j]);
        }
        printf("\n");
    }
   
    fclose(fp1);
   
    printf("# of vector size: ");
    fgets(buf, sizeof(buf), stdin);
    sscanf(buf, "%d", &num);
    printf("vecx allocation\n");
   
    //vecxの動的確保
    vecx = dvector(num);
 //vecxのファイルからの読み込みと初期化
    printf("vecx=\n");
    for (int i=0; i<num; i++) {
        fscanf(fp2, "%lf", &vecx[i]);
        printf("%.2lf ", vecx[i]);
        printf("\n");
    }
 
 fclose(fp2);
   
 //vecbの動的確保
    vecb = dvector(nrow);
    //vecbの初期化
    for (int i=0; i<nrow; i++) {
        vecb[i] = 0;
    }
   
 //計算
    mul_A3x(matrixA, vecx, vecb);
   
 //vecbの表示
    printf("vecb=\n");
    for (int i=0; i<nrow; i++) {
        printf("%.2lf ", vecb[i]);
        printf("\n");
    }
   
    free(vecb);
    free(vecx);
    free(matrixA);
   
    return 0;
}
 
//1次元配列の動的確保
double *dvector(int n)
{
    double *vec= malloc(n*sizeof(double));
    if (vec == NULL) {
        printf("Failure!! (from dvector) \n");
        exit(1);
    }
    return(vec);
}
 
//2次元配列の動的確保
double **dmatrix(int nr, int nc) {
    double **mat;
    mat = malloc(nr*sizeof(double *));
    if (mat == NULL)
        puts("Failure!! (from (*dmatrix)[nr])");
    else {
        int i;
        double *base = malloc(nr*nc*sizeof(double));
        if (base == NULL)
            puts("Failure!! (from dmatrix[nr][nc])");
        else {
            for (i=0; i < nr; i++)
                mat[i] = base + i*nc;
        }
        free(base);
    }
    return(mat);
}
 
//行列とベクトルの計算
void mul_A3x(double (*A)[3], double *x, double (*b))
{
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<3; j++)
        {
            b[i] += A[i][j]*x[j];
        }
    }
}

Name: usao
[URL]
ハッカー(140,412 ポイント)
Date: 2017年12月07日(木) 16:34
No: 2
(OFFLINE)

 Re: 行列とベクトルの積の計算

119行目の
> free(base);
は,まずくないですか?


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[11人]