行列とベクトルの積をとってベクトルを計算する(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];
}
}
}