• ベストアンサー

行列の行の入換え

| -1 -1 -2 -1 10 | | -1 -2 -1 10 -1 | | -2 -1 10 -1 -1 | | -1 10 -1 -1 -2 | | 10 -1 -1 -2 -1 | この行列を次の順序で並び替えたいのですが 1.第1列にある要素の中で絶対値の最大値がある行を探し,その行と第1行を入れ換える. 2.第2列にある要素の中で絶対値の最大値がある行を第2行以下から探し,その行と第2行を入れ換える. 3.これを左上から右下へ順次移動して,行の入れ換えを行う. #include<stdio.h> #include<math.h> #define N 5 #define M 5 int main(){ float a[N][M]={{-1.0,-1.0,-2.0,-1.0,10.0},{-1.0,-2.0,-1.0,10.0,-1.0},{-2.0,-1.0,10.0,-1.0,-1.0}, {-1.0,10.0,-1.0,-1.0,-2.0},{10.0,-1.0,-1.0,-2.0,-1.0}}; float nmax; int i,j,k=0,s,imax; for(j=0; j<M; j++){ nmax = a[0][j]; imax = 0; for(i=1; i<N; i++){ if(fabs(nmax) < fabs(a[i][j])){ nmax = a[i][j]; imax = i; } } for(j=0; j<M; j++){ s=a[k][j]; a[k][j]=a[imax][j]; a[imax][j]=s; } k++; } for(i=0; i<N; i++){ for(j=0; j<M; j++){ printf("%5.1f ",a[i][j]); } printf("\n"); } return(0); } このように作成したのですが、1行目と5行目しかいれかわりません。 なぜでしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

> jはそのつど、初期化されているので関係なく使用していいのかな > とおもったのですがだめなのでしょうか? jではループの中で潰してしまってはダメですね iなら用済みになっているので使えますが ・・・ #3氏のコードで 交換数行が同じなら exchangeMatrixを呼び出さないようにするか 何もしないで帰ったほうが良いかもしれません void exchangeMatrix(int (*mat)[COL], int r0, int r1) {   int t, i;   if ( r0 == r1 )     return;   for (i = 0; i < COL; ++i) {     t = mat[r0][i], mat[r0][i] = mat[r1][i], mat[r1][i] = t;   } } または main側を for (i = 0; i < ROW; ++i) {   int maxrow = getMaxRowNo(mat, i);   if ( i != maxrow ) {     exchangeMatrix(mat, maxrow, i);   } } といった具合で

nanokea
質問者

お礼

返信ありがとうございます。 確認したところ、jだとつぶしあっていたためだめでした。 おかげさまで理解することができました。 ありがとうございます。

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

よくわからないですが、こういうようなことがしたいのでしょうか。 #include <stdio.h> #include <math.h> #define ROW (5) #define COL (ROW) void printMatrix(int (*mat)[COL], int r) { int i, j; for (i = 0; i < r; ++i) { for (j = 0; j < COL; ++j) { printf("%3d", mat[i][j]); } putchar('\n'); } putchar('\n'); } int getMaxRowNo(int (*mat)[COL], int r) { int maxRowNo, i; for (maxRowNo = r, i = r + 1; i < ROW; ++i) { if (abs(mat[i][r]) > abs(mat[maxRowNo][r])) { maxRowNo = i; } } return maxRowNo; } void exchangeMatrix(int (*mat)[COL], int r0, int r1) { int t, i; for (i = 0; i < COL; ++i) { t = mat[r0][i], mat[r0][i] = mat[r1][i], mat[r1][i] = t; } } int main(void) { int mat[ROW][COL] = { { -1, -1, -2, -1, 10 }, { -1, -2, -1, 10, -1 }, { -2, -1, 10, -1, -1 }, { -1, 10, -1, -1, -2 }, { 10, -1, -1, -2, -1 }, }; int i; printf("【入れ替え前】\n"); printMatrix(mat, ROW); for (i = 0; i < ROW; ++i) { exchangeMatrix(mat, getMaxRowNo(mat, i), i); } printf("【入れ替え後】\n"); printMatrix(mat, ROW); return 0; }

nanokea
質問者

お礼

返信ありがとうございます。 確かに見やすくとてもいいですね! 参考にさせていただきます。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

>さらに、効率のよい作り方はないでしょうか??  その前に、変数の型を見直された方がよいのでは・・。   ☆ヒント:「入れ換え」に用いている s は int 型です。  たまたま、今回のデータ例は、x.0 でよいのですが・・。  それとも、質問文の冒頭のとおり、データは整数?。      だったら float → int 。

nanokea
質問者

お礼

返信ありがとうございます。 出力はx.0で表示しろとのことでした。 参考にさせていただきます。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

質問の答えは既に出ていますが、それとは別に気になるとこを指摘しておきます。 > float a[N][M]={{-1.0,-1.0,-2.0,-1.0,10.0},{-1.0,-2.0,-1.0,10.0,-1.0},{-2.0,-1.0,10.0,-1.0,-1.0}, {-1.0,10.0,-1.0,-1.0,-2.0},{10.0,-1.0,-1.0,-2.0,-1.0}}; 1行単位で改行、要素単位で空白を入れると非常にみやすくなります。 float a[N][M]={ {-1.0, -1.0, -2.0, -1.0, 10.0}, {-1.0, -2.0, -1.0, 10.0, -1.0}, {-2.0, -1.0, 10.0, -1.0, -1.0}, {-1.0, 10.0, -1.0, -1.0, -2.0}, {10.0, -1.0, -1.0, -2.0, -1.0} }; > nmax = a[0][j]; > imax = 0; > for(i=1; i<N; i++){ 仕様は「第k列内の最大要素を第k行以下から探し、その行と第k行を入れ替える」のようなのですがこの記述では必ず全行検索してしまいます。 列が移動するたびに行の起点も変更しなければならないのでは? nmax = a[k][j]; imax = k; for(i = k + 1; i < N; i ++){ ...

nanokea
質問者

お礼

返信ありがとうございます。 ご指摘されたとおりですm(__)m 問題文をよくよんでませんでした。 話は変わり、今回は上記であるプログラムをつくりましたが さらに、効率のよい作り方はないでしょうか??

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

行の入れ替えに jを使っているのが原因でしょう このルーチンで 2つ上のforループのjを破壊しています for(j=0; j<M; j++){   s=a[k][j];   a[k][j]=a[imax][j];   a[imax][j]=s; }

nanokea
質問者

お礼

迅速な回答ありがとうございます。 >このルーチンで 2つ上のforループのjを破壊しています for(j=0; j<M; j++){   s=a[k][j];   a[k][j]=a[imax][j];   a[imax][j]=s; } jをほかの変数に変えたら正しい出力になりました。 jはそのつど、初期化されているので関係なく使用していいのかなとおもったのですがだめなのでしょうか?

関連するQ&A

  • 行列に関して。

    以下の行列を対角成分が最も大きくなるような プログラムをつくりたいのですが 0   1   4  3 7   0   1  -5 1    3   0   7 -2   4   4  -8 #include<stdio.h> #include<math.h> #include<stdlib.h> #define NUM 4 int main(){ /* 初期化 */ int i; /* ループ変数 (行)*/ int j; /* ループ変数 (列)*/ int k; /* ループ変数 */ int imax; /* 最大値のi成分 */ int jmax; /* 最大値のj成分 */ double nmax; /* 最大値を入れるための変数 */ double tmp; /* ソートのための一時的な変数 */ double eps = 1.0e-6; /* 判定値 */ double a[NUM][NUM] = { { 0.0, 1.0, 4.0, 3.0}, { 7.0, 0.0, 1.0, -5.0}, { 1.0, 3.0, 0.0, 7.0}, {-2.0, 4.0, 4.0, -8.0}}; /* 対象とする要素位置 = k */ for( k = 0 ; k < NUM ; k++ ){ /*対象とする要素位置 = k*/ nmax = 0.0;/* 初期化 */ imax = k;/* 初期化 0とは限らない */ jmax = k;/* 初期化 0とは限らない */ /* 1.絶対値の最大値を求める */ for( i = k ; i < NUM ; i++ ){ for( j = k ; j < NUM ; j++ ){ if(fabs(nmax) < fabs(a[i][j])){ nmax = a[i][j]; imax = i; jmax = j; /* 対象としている行列要素の中で,最大となる行列要素のi,j成分を探す */ /*ここに絶対値の最大値を求め、nmax、imax、jmaxに代入するプログラムを書く*/ /*絶対値の求め方、数学関数fabs(x)を用いる*/ } } } /* 2.行入れ換え */ if( k != imax ){/* 対象としている行と最大値を持つ行が同じなら,入れ替える必要が無い */ for( j = 0 ; j < NUM ; j++ ){ tmp=a[k][j]; a[k][j]=a[imax][j]; a[imax][j]=tmp;/* 対象としている行と最大値を持つ行との入れ替え */ /*ここに行の入れ替え行うプログラムを書く*/ } } /* 3.列入れ換え */ if( k != jmax ){/* 対象としている列と最大値を持つ列が同じなら,入れ替える必要が無い */ for( i = 0 ; i < NUM ; i++ ){ tmp=a[i][k]; a[i][k]=a[i][imax]; a[i][imax]=tmp;/*対象としている列と最大値を持つ列との入れ替え*/ /*ここに列の入れ替え行うプログラムを書く*/ } } } /* 結果の出力 */ for(i=0; i<NUM; i++){ for(j=0; j<NUM; j++){ printf("%5.1f ",a[i][j]); } printf("\n"); } /*ここに行列の表示プログラムを書く*/ return(0); } 上のぷろぐらむを実行しても、1個目のfor文の1ループ目で終了してしまい 1行目と、4行目を交換、4列目と1列目を交換した行列だけが表示されます。 結果が以下のような行列にするにはどう改善すればよいでしょうか? -8.0   -2.0  4.0  4.0 -5.0   7.0  1.0  0.0   3.0   0.0  4.0  1.0  7.0   1.0  0.0  3.0 です。

  • 行列の計算

    #include<stdio.h> #define N 2 #define M 3 void hyoji(float[][M]); int main(){ int i,j,k; float a[N][M] = {{2.0,2.0,2.0},{2.0,2.0,2.0}}; float b[M][M] = {{1.0,1.0,1.0},{2.0,2.0,2.0},{1.0,1.0,1.0}}; float c[N][N]; for(i=0; i<N; i++){ for(j=0; j<M; j++){ c[i][j] = 0; for(k=0; k<M; k++){ c[i][j] += a[i][k] * b[k][j]; } } } hyoji(c); return(0); } void hyoji(float x[][M]){ int i,j; for(i=0; i<N; i++){ for(j=0; j<M; j++){ printf("%4.1f ",x[i][j]); } printf("\n"); } } 以上のプログラムで 行列aと行列bをかけ合せた行列cを求めるのですが コンパイルすると 8 8 8 8 8 1 となり、正しい結果がでません。 なにが間違っているのでしょうか?? よろしくお願いします。

  • C言語 多重配列に関して

    以下のプログラムについての質問です。 10行目 for i = 0 の時、13行目 for j = 0 で scanf("%lf", &a[0][0])に10と代入します。 この時のドス画面は input 1-th line element:10 です。ここまではいいのですが、この次がよくわかりません。私の考えでは、10行目 i = 0 の時 13行目 j = 1 となって j がNMAXまでやったら、10行目のiが1になってまた同じように動いて、10行目の i がNMAXになったら、for文が終わると考えたのですが、このプログラムの実行結果(一番下にあります)を見てみると自分の考えが間違っていることに気がつきました。 3行3列のプログラムなので、a[0][0] a[0][1] a[0][2] a[1][0].......となると考え、scanfでドス画面に9回数字を打ち込むかと思ったのですが実際は3回でした。このプログラムはどのように読んだら良いのでしょうか?? 回答宜しくお願い致します。 1  #include <stdio.h> 2  #define NMAX 3 3 4  main() 5  { 6   double a[NMAX] [NMAX], b[NMAX] [NMAX], c[NMAX] [NMAX]; 7   int i,j,k; 8 9   printf("matrix 1:\n"); 10   for(i=0; i< NMAX; i++) 11   { 12   printf("input %d-th line element:", i+1); 13   for(j=0; j< NMAX; j++); 14   { 15   scanf("%lf", &a[i][j]); 16   } 17   } 18   printf("matrix 2:\n"); 19   for(i=0; i<NMAX; i++) 20   { 21   printf("input %d-th line element:", i+1); 22   for(j=0; j< NMAX; j++); 23   { 24   scanf("%lf", &b[i] [j]); 25   } 26   } 27  for(i=0; i<NMAX; i++) 28   { 29   for(j=0; j<NMAX; j++) 30   { 31   c[i][j] = 0; 32   for(k=0; k <NMAX; k++) 33   { 34   c[i][j] += a[i][k] * b[k][j]; 35   } 36   } 37   } 38 39  printf("matrix 1 * matrix2 = :\n"); 40  for(i=0; i<NMAX; i++) 41   { 42   printf("["); 43   for(j=0;j<NMAX; j++) 44   { 45   printf("%f", c[i][j]); 46   } 47   printf("]\n"); 48   } 49  }

  • Gaussの消去法のプログラムなんですがこれを利用して、消去法による行

    Gaussの消去法のプログラムなんですがこれを利用して、消去法による行列式の計算プログラムをつくりたいのですが難しくてよくわかりません。。。 教えていただきたいです。 困ってるのでよろしくお願いします。 int gauss(double *x, double *a, double *b, int n) { int i,j,k,m; double tmp,p,sum; for(k=0; k<n-1;k++){ printf("---- Step %d ----\n",k+1); printf("-- before --\n"); for( m = k;m < n;m++){ printf("%lf\n",a[n * m + k]); } printf("-- --\n"); j = pivot(a,n,k); if(j == ERROR) { return ERROR; } else { if(j != k) { for(i=0; i<n; i++){ tmp = a[n*k+i]; a[n*k+i] = a[n*j+i]; a[n*j+i] = tmp; } tmp=b[j]; b[j]=b[k]; b[k]=tmp; } } printf("-- after --\n"); for( m = k;m < n;m++){ printf("%lf \n",a[n * m + k]); } for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; printf("a[%d %d]=%lf",i,j,a[n*i+j]); } b[i]=b[i]-p*b[k]; printf("b[%d]=%lf\n",i,b[i]); } printf("k=%d\n",k); /*--------------------------------------------------------------------------*/ } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS){ return(ERROR); } sum=0.0; for(j=k+1; j<n; j++){ sum+=a[n*k+j]*x[j]; } x[k]=(b[k] - sum)/a[k*n+k]; } return 0; } int pivot(double *a, int n, int k) { int i,m; double d; /* ピボットの探索 */ m = k; d = fabs(a[k*n+k]); for(i=k+1; i<n; i++){ if(fabs(a[n*i+k]) > d){ m = i; d = fabs(a[n*i+k]); } } if(fabs(d) < EPS) { return ERROR; } else { return m; } }

  • 正しい結果が表示されない

    以下のプログラムはガウスの消去法を使って 解を求めるプログラムです。 しかし、gauss関数にprintf関数を入れてコンパイルすると 正しい結果 5 3 1 0 0 がでますが、gauss関数にprintf関数をいれずmain関数に書くと 0 0 0 0 0 となります。 なぜでしょうjか?? #include<stdio.h> #include<math.h> #define N 5 void gauss(double a[N][N+1]); int main(){ double a[N][N+1] = { { 1,-1,-1,-1,-1, 1}, {-1, 1,-1,-1,-1,-3}, {-1,-1, 1,-1,-1,-7}, {-1,-1,-1, 1,-1,-9}, {-1,-1,-1,-1, 1,-9} }; double x[N]; int i; gauss(a); printf("\n[x]=\n"); /* x[i] を表示する */ for(i=0; i<N; i++){ printf(" %8.3lf\n", x[i]); } return(0); } void gauss(double a[N][N+1]) { int i,j,k,p; double m, pmax, s, x[N]; for(k = 0; k < N-1; k++){ /* ピボット操作 */ p = k; /* p, pmax の初期値 */ pmax = fabs(a[k][k]); for(i = k+1; i < N; i++){ /* 最大値を検索 */ if(fabs(a[i][k]) > pmax){ p = i; pmax = fabs(a[i][k]); } } if(fabs(pmax) < 1.0e-12){ /* 最大値がゼロに近い時はエラー */ fprintf(stderr, "too small pivot!\n"); exit(1); } if(p != k){ /* ピボット操作 */ for(j = 0; j < N+1; j++) { s = a[k][j]; /* 値の入れ替え */ a[k][j] = a[p][j]; a[p][j] = s; } } for(i = k+1; i < N; i++) { /* 第 i 行 */ m = a[i][k] / a[k][k]; /* 倍率 m を計算 */ a[i][k] = 0; /* 注1 (下記参照) */ for(j = k+1; j < N+1; j++) { /* 第 j 列 */ a[i][j] = a[i][j] - a[k][j] * m; } } } for(i = N-1; i >= 0; i--){ /* 後退代入 */ m = 0; for(j = N-1; j > i; j--){ m = m + a[i][j] * x[j]; } x[i] = (a[i][N] - m) / a[i][i]; } }

  • 掃出法で連立一次方程式の解を求める

    掃出法で連立一次方程式の解を求めるプログラムを作ってみたのですが、ポインタと浮動小数点のエラーが出てしまい、実行できません。どこが間違っているのかさえ分からず困っています。訂正箇所を教えてください。宜しくお願い致します。 #include<stdio.h> #include<math.h> #include <float.h> #define N 3 #define EPSILON 1.0E-5 #define TRUE 1 #define FALSE 0 void sweep(int *flag); void swap(float *wk1,float *wk2); float a[N][N]={{ 2, 6, 3}, {-1, 5,-2}, {-2,-1, 6}}; float x[N],b[N]={6,3,14}; int flag; void main() { int i,j; for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%10.4f",a[i][j]); printf("%10.4f\n",b[i]); } flag=TRUE; sweep(&flag); if(flag==TRUE) { printf("連立方程式の解\n"); for(i=0;i=N;i++) printf("x[%d]=%10.4f\n",i+1,x[i]); } else printf("解なし\n"); } void swap(float *wk1,float *wk2) { float w; w=*wk1; *wk1=*wk2; *wk2=w; } void sweep(int *flag) { int i,j,k,ik; float ak,aik; for(k=0;k<N;k++) { ak=a[k][k]; if(fabs(ak)<=EPSILON) { ik=k+1; while((ik<N)&&(fabs(a[ik][k])<EPSILON)) ik++; if(ik<N) { for(j=k;j<N;j++) swap(&a[k][j],&a[ik][j]); swap(b[k],b[ik]); ak=a[k][k]; } else { printf("ピボットが零です\n"); *flag=FALSE; goto end; } } for(j=k;j<N;j++) a[k][j]=a[k][j]/ak; b[k]=b[k]/ak; for(i=0;i<N;i++) { if(i!=k) { aik=a[i][k]; for(j=k;j<N;j++) a[k][j]=a[i][j]-aik*a[k][j]; b[i]=b[i]-aik*b[k]; } } for(k=0;k<N;k++) x[k]=b[k]; end:; } }

  • 行列をべき乗させるプログラム

    2行2列を5乗させるプログラムを作って、一応できたつもりだったんですが結果が合いません・・・ 何かヒントでもいいのでわかる方いらっしゃいましたらよろしくお願いします。 <プログラム> #include <stdio.h> #define N 2 int A[N][N]; int A_NEW[N][N]; int A_5[N][N]; /* 行列Aを5乗したもの */ int main() { int i,j,k,l; /* 2行2列の係数行列Aの成分を入力 */ printf("係数行列Aを%d行%d列で入力してください\n", N, N); for( i=0; i<N; i++) { for( j=0; j<N; j++) { printf("A[%d][%d]=", i+1, j+1); scanf("%d", &A[i][j]); } } for(i=0; i<N; i++) /* A_NEW=A*Aの計算 */ { for(j=0; j<N; j++) { for(k=0; k<N; k++) { A_NEW[i][j] += A[i][k] * A[k][j]; } } } for(l=0; l<3; l++) { for(i=0; i<N; i++) /* A_5の計算 */ { for(j=0; j<N; j++) { for(k=0; k<N; k++) { A_5[i][j] += A_NEW[i][k] * A[k][j]; } } } for(i=0; i<N; i++) { for(j=0; j<N; j++) { A_NEW[i][j] = A_5[i][j]; } } } printf("A_5=\n"); /* 出力 */ for( i=0; i<N; i++) { for( j=0; j<N; j++) { printf("%d ", A_5[i][j]); } printf("\n"); } } <入力例> A= 1 3 2 1 <期待する結果> A= 241 303 202 241 <このプログラムの結果> 406 498 332 406

  • マトリクスの行列式の値

    以下のプログラムで「マトリクスの行列式の値」を示す部分はどこにあたりますか?? よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void){ int i,j,k,p,N; double r,*b,*a,*ai,*ak,*ap; double amax; /*第k列の第k行から第N-1行までの最大値*/ printf("N="); scanf("%d",&N); a= (double*)malloc(N*N*sizeof(double)); if(a==NULL){ printf("Can't allocate memory"); exit(1); } ai=a; ak=a; for(i=0;i<N;i++){ for(j=0;j<N;j++){ printf("a[%d][%d]=",i,j); scanf("%lf",&ai[j]); } ai+=N; } b=(double*)malloc(N*sizeof(double)); if(b==NULL){ printf("Can't allocate memory"); exit(1); } for(i=0;i<N;i++){ printf("b[%d]",i); scanf("%lf",&b[i]); } for(k=0;k<N-1;k++){ /*前進消去法*/ ai=ak+N; ap=a; p=k; amax=ak[k]; for(i=k+1;i<N;i++){ /*k行からN-1行の中で最大のものをだす*/ if(fabs(amax)<fabs(ai[k])){ p=i; /*最大となる値とその値の行を記憶*/ amax=ai[k]; } ai+=N; } ap+=p*N; for(j=0;j<N;j++){ /*第k行と第p行を入れ替える*/ amax=ak[j]; ak[j]=ap[j]; ap[j]=amax; } amax=b[k]; b[k]=b[p]; b[p]=amax; ai=ak+N; for(i=1+k;i<N;i++){ r=ai[k]/ak[k]; for(j=k+1;j<N;j++){ ai[j]-=ak[j]*r; } b[i]-=r*b[k]; ai+=N; } ak+=N; } /*このときのakは第N-1行を指すポインタとなっている*/ for(k=N-1;0<=k;k--){ for(j=N-1;k<=j;j--){ /*後退代入*/ if(j!=k){ b[k]-=ak[j]*b[j]; } } b[k]=b[k]/ak[k]; /*今回は特に変数xなどをつくらなくても答は出せる*/ ak-=N; } free(a); for(i=0;i<N;i++){ printf("x[%d]=%.2f\n",i,b[i]); } free(b); return 0; }

  • お願いします。

    #include<stdio.h> #include<math.h> #define nmax 50 #define n 1000 #define nout 5 #define m 20 #define dfcoef 0.1 int main(void) { int i,j,k,r,dt,dx,it; double a[nmax][nmax*2], b[nmax][nmax],tb[nmax][nmax]; FILE *fq; fq=fopen("kadai4.csv","w"); for(i=0;i<m-1;i++){ //初期値を設定 a[i][m-1]=1.0; } for(it=0;it<=n;it++){ //時間増分するループ dt=1./(double)n; dx=1./(double)m; r=dt/(dx*dx); for(i=0;i<m-1;i++){ //係数行列の設定 a[i][i]=1+2*r; } for(i=0;i<m-2;i++){ a[i][i+1]=-r; } for(i=0;i<m-2;i++){ a[i+1][i]=-r; } for(i=0;i<m-3;i++){ for(j=i+2;j<m-1;i++){ a[i][j]=0.0; } } for(i=0;i<m-3;i++){ for(j=i+2;j<m-1;i++){ a[j][i]=0.0; } } hakidashi(m, a, b); //関数の呼び出し tb[0][0]=0.0; //tbを設定 tb[m][0]=0.0; for(i=0;i<m-1;i++){ tb[i+1][0]=b[i][0]; } for(i=0;i<m+1;i++){ fprintf(fq,"%f\t",tb[i][0]); } fprintf(fq,"\n"); for(i=0;i<m-1;i++){ //時間を進める a[i][m-1]=tb[i+1][0]; } } fclose(fq); return(0); } int hakidashi(double a[][nmax*2],double b[][nmax]) { int i, j, k, ip, jp; double coe, temp; for(ip=0;ip<m-1;ip++){ jp=0; coe=a[ip][jp]; for(j=1;j<m-1;j++){ //枢軸を設定 if(fabs(coe)<fabs(a[ip][j])){ coe=a[ip][j]; jp=j; } } for(j=0;j<m;j++){ //各列を枢軸で割る a[ip][j]=a[ip][j]/coe; } for(i=0;i<m-1;i++){ coe=a[i][jp]; for(j=0;j<m;j++){ //枢軸以外の各列の要素を0にする if(i==ip)continue; a[i][j]=a[i][j]-a[ip][j]*coe; } } } for(j=0;j<m-1;j++){ //単位行列にする for(i=0;i<m-1;i++){ if(a[i][j]==1.0){ for(k=0;k<m;k++){ temp=a[j][k]; a[j][k]=a[i][k]; a[i][k]=temp; } } } } for(i=0;i<m-1;i++){ //解行列を作成 b[i][0]=a[i][m-1]; } } このプログラムを実行するとプログラムを終了しますとでるのですがなぜなのか教えてください。

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

専門家に質問してみよう