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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ben

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

#1

投稿記事 by ben » 7年前

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

コード:

#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];
        }
    }
}



アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

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

#2

投稿記事 by usao » 7年前

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

返信

“C言語何でも質問掲示板” へ戻る