C言語の行列の計算です.
NNの正方行列とN1のベクトルの掛け算で動的確保の勉強です.
Nをとりあえずdefineで定義しているのですが,N=2,4,5あたりは問題なく作動するのですが,N=3,8,9あたりは必ずsegmentation faultと出てしまいます.(このエラーについてはよくわかっていません)
以下がコードです.行列の動的確保のコードは授業で配布された物を使用しており,まだしっかりとは解釈できていませんがとりあえず見よう見まねで使いました.
C
1#include <stdio.h> 2#include <stdlib.h> 3#define N 3 4 5double **dmatrix(int, int); /* 行列領域の確保 */ 6double *dvector(int ); /* ベクトル領域の確保 */ 7 8int main(void) { 9 double **mat_A; /* ポインタへのポインタ */ 10 double *vec_x, *vec_b; 11 12 printf("N=%d\n",N); 13 14 mat_A = dmatrix(N, N); /* 領域確保 */ 15 vec_x = dvector(N); 16 vec_b = dvector(N); 17 18 for(int s=0;s<N;s++){ 19 for(int t=0;t<N;t++){ 20 mat_A[s][t] = (double)(s+t); 21 vec_x[s] = (double)s; 22 vec_b[s] = (double)0; 23 printf("mat_A[%d][%d]=%lf, vec_x[%d]=%lf, vec_b[%d]=%lf\n",s,t,mat_A[s][t],s,vec_x[s],s,vec_b[s]); 24 } 25} 26 27 28 for(int i=0;i<N;i++){ 29 for(int j=0;j<N;j++){ 30 vec_b[i] += mat_A[i][j]*vec_x[j]; 31 } 32} 33 for(int k=0;k<N;k++){ 34 printf("\n b[%d]=%lf \n",k,vec_b[k]); 35 } 36 printf("\n"); 37 38 free(mat_A); 39 free(vec_x); 40 free(vec_b); 41 return 0; 42} 43 44double **dmatrix(int nr, int nc) { 45 double **mat; 46 mat = malloc(nr*sizeof(double *)); 47 if (mat == NULL) 48 puts("Failure!! (from (*dmatrix)[nr])"); 49 else { 50 int i, j; 51 double *base = malloc(nr*nc*sizeof(double)); 52 if (base == NULL) 53 puts("Failure!! (from dmatrix[nr][nc])"); 54 else { 55 for (i=0; i < nr; i++) 56 mat[i] = base + i*nc; 57 } 58 free(base); 59 } 60 return(mat); 61} 62 63double *dvector(int n) 64{ 65 double *vec= malloc(n*sizeof(double)); 66 if (vec == NULL) { 67 printf("Failure!! (from dvector) \n"); 68 exit(1); 69 } 70 return(vec); 71} 72 73 74
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/09 14:40