• 締切済み

高速フーリエ変換に関すること

皆様、こんばんわ。 今日は、お聞きしたいことが会ってここに質問しにきました。 まず、こちらを見てください。 これは、「毎回異なる計算結果を、順次足していく」、 そのための練習用プログラムです。 #include<stdio.h> int main(void){ int i,j; int z[3]={0}; int a[5]={1,2,3,4,5}; int b[5]={5,4,3,2,1}; for(i=0;i<3;i++){ for(j=0;j<5;j++) Z[i] += a[j]*b[j]; if (i==1) z[i]=z[1] else (i>1) z[i]+z[i-1] } printf("a = {%d,%d,%d,%d,%d}\n",a[0],a[1],a[2],a[3],a[4]); printf("b = {%d,%d,%d,%d,%d}\n",b[0],b[1],b[2],b[3],b[4]); for(i=0;i<3;i++) printf("z[%d] = %d\n",i,z[i]); return(0); } 流れとしては、 (1)2つの配列の各要素の積の計算をする。 (2)そして、計算して出た積(全部で5つ)を足す。 (3) (1)~(2)の計算を繰り替えす。 (但し、1回目以降は前回の計算結果を足す) そして最終的に、 a[5] = {1,2,3,4,5} b[5] = {5,4,3,2,1} Z1 = 35 Z2 = 70 Z3 = 105 という結果を出力したいんです。 ですが、どうしてもエラーが起きて実行できません。 たぶんですが、if-else文の辺りが違うと思うのですが・・・。 どういう風に変更したらいいのでしょうか? ちなみに使っているコンパイラVidualC++2008です。 OSはVistaです。

みんなの回答

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.5

#include<stdio.h> int main(void){ int i,j; int z[3]={0}; int a[5]={1,2,3,4,5}; int b[5]={5,4,3,2,1}; for(i=0;i<3;i++){ for(j=0;j<5;j++) z[i] += a[j]*b[j]; if(i>0) z[i]+=z[i-1]; } printf("a = \ {%d,%d,%d,%d,%d}\n",a[0],a[1],a[2],a[3],a[4]); printf("b = \ {%d,%d,%d,%d,%d}\n",b[0],b[1],b[2],b[3],b[4]); for(i=0;i<3;i++) printf("z[%d] = %d\n",i,z[i]); return(0); }

arubaaruba
質問者

お礼

こ、こんなあっさりできるんですね@@; 自分はもっと複雑になるんだとばっかり思ってました。 次からは、もっと簡潔にできるようにします!

全文を見る
すると、全ての回答が全文表示されます。
  • u-bot
  • ベストアンサー率58% (1736/2988)
回答No.4

int z[3]={0}; は問題無し。Z配列は全て初期化される。 エラー発生箇所が判れば回答がつけやすいと思う。 気になるのはここかな? if (i==1) z[i]=z[1]   ← ;が無い。なぜ1なのか? else (i>1)   ← 条件文をつけるならifが必要 z[i]+z[i-1]   ← 加算しても代入する変数が指定されていない } の部分を if (i==0) z[i]=z[0]; else if(i>0)  ← 単にelseだけでも可 z[i]+=z[i-1]; } とすれば少しはましになるかな? 申し訳ありませんが高速フーリエ変換のアルゴリズムを知らずにソースだけ見て回答しています。 少しでも参考になれば幸いです。

arubaaruba
質問者

お礼

あああああ、:は忘れてました! z[1]になってるのは、友達にそこはそうなんだよって教えられたからなんですが、違ったんですねw そっか、+=っていうのがありましたねw

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

>>int z[3]={0}; >これでは、z[0]しか初期化されていないので、z[1]、z[2]には不定値が入っている。  これは、違う。  

全文を見る
すると、全ての回答が全文表示されます。
  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.2

>「エラーが起きて実行できません」というくらいなら, そのエラーメッセージを出してもいいと思うんだがなぁ. 同意です。 で、気になったところ。 >int z[3]={0}; これでは、z[0]しか初期化されていないので、z[1]、z[2]には不定値が入っている。 なので、 >Z[i] += a[j]*b[j]; /*なぜZが大文字?*/ Zは小文字でしょう。 また、小文字としても、z[0]以外には不定値が入っていることになる。 -----> if (i==1) z[i]=z[1] else (i>1) z[i]+z[i-1] } <----- iが1のとき、 z[i]=z[1] は、同じところに同じ値を代入しているので無意味。 iが2のとき、 z[i]+z[i-1] は何にも代入していないので無意味。

arubaaruba
質問者

お礼

Zが大文字なのは、打ち間違えたからですw

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「エラーが起きて実行できません」というくらいなら, そのエラーメッセージを出してもいいと思うんだがなぁ.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 原因が分かりません!

    C言語の課題です 行列AとBの積Cの結果を表示して、Cの最大値最小値を表示せよというものです。 Cは正しい結果なのですが、最大値と最小値が正しくありません。 なぜこうなるのか原因が不明なので指摘お願いします 期限が7月1日なので早急に解答を寄せてもらえれば嬉しいです #include <stdio.h> int main(void) { int i, j, k; int a[2][2] = { {1,8}, {3,9} }; int b[2][2] = { {4,7}, {2,1} }; int c[2][2] = {0}; int max, min; puts( "matrix A =" ); for(j=0; j<2; j++){ for(k=0; k<2; k++){ printf( "%3d" , a[j][k]); } printf( "\n" ); } puts( "matrix B =" ); for(k=0; k<2; k++){ for(i=0; i<2; i++){ printf( "%3d" , b[k][i]); } printf( "\n" ); } puts( "AとBの積\nmatrix C ="); for(j=0; j<2; j++){ for(i=0; i<2; i++){ for(k=0; k<2; k++) c[j][i] += a[j][k]*b[k][i]; printf( " %3d" , c[j][i]); } printf( "\n" ); } { if( j==0 && i==0 ){ max = c[j][i]; min = c[j][i]; } if( max < c[j][i] ) max = c[j][i]; if( min > c[j][i] ) min = c[j][i]; max = c[0][0]; min = c[0][0]; printf( "行列Cの最大値 : %d\n", max, c[j][i] ); printf( "行列Cの最小値 : %d\n", min, c[j][i] ); } return (0); }

  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • 行列の積を関数を使って求める・・?

    2つの行列の行と列を入力し、積を計算するプログラムを関数を使って書きたいのですが、上手く行きません。どこをどのように直したらよいか教えてください!お願いします!! 以下が私が書いたプログラムです。 #include<stdio.h> #define NUMBER 10 int first(int x1,int x2,int y1,int y2,int i,int j,int k) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; do{ printf("2つの行列の行と列を入力してください\n"); scanf("%d", &x1); scanf("%d", &x2); scanf("%d", &y1); scanf("%d", &y2); if(x1 != y2){ printf("行列の積は計算できません\n"); } }while(x1 != y2); printf("行列Aの要素を入力してください\n"); for(i=0; i<x1; i++){ for(j=0; j<x2; j++) scanf("%d", &a[i][j]); } printf("行列Bの要素を入力してください\n"); for(j=0; j<y1; j++){ for(k=0; k<y2; k++) scanf("%d", &b[j][k]); } } int second(int x1,int x2,int y1,int y2,int i,int j,int k) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; for(i=0; i<x1; i++){ for(k=0; k<y2; k++){ for(j=0; j<x2; j++) c[i][k] = c[i][k] + a[i][j]*b[j][k]; } } for(i=0; i<x2; i++){ for(k=0; k<y2; k++) printf("%3d", c[i][k]); printf("\n"); } } int main(void) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; printf("行列の積を計算します\n %d\n", first(x1,x2,y1,y2,i,j,k)); printf("行列Aと行Bの積は\n %3d",second(x1,x2,y1,y2,i,j,k)); }

  • 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; } }

  • 外積のプログラムについて質問があります

    ベクトルの外積のプログラムについて質問があります 環境はリナックスです 問題は2つの実ベクトルa,bをキーボードから入力しその外積を求めるプログラムです i<jである組み合わせに対してai*bj-aj*biを並べたものです 次元nについてはキーボードから入力します wedge内で外積を求める計算をします #include <stdio.h> int *wedge(int *a, int *b, int *c); int main() { int n; int a[100]; int b[100]; int i; int j; printf(" nの値を入力" ); scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%d",&a[i]); } for(i = 0; i < n; i++){ scanf("%d",&b[i]); } for(i = 0; i < n; i++){ printf("a[%d]=%d\n",i, a[i]); } for(i = 0; i < n; i++){ printf("b[%d]=%d\n",i, b[i]); } } int *wedge(int *a, int *b, int *c) { int i; int j; *c = a[i] * b[j] - a[j] * b[i]; if ( i < j ){ *c = a[i] * b[j] - a[j] * b[i]; } else { *c = 0 ; } printf("*c = %d",a[i] * b[j] - a[j] * b[i]); } このようなプログラムを作ったのですが外積を表示させることができません。 修正したプログラムをおしえていただけないでしょうか

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • 以前も同じ質問したのですがもう一度お願いします

    以前も同じ質問したのですがもう一度お願いします プログラミングで3行3列の行列Aに対しAの2乗、Aの3乗を求めるプログラムを作成したいのですが下記のプログラムでは3行3列まで表示できません どこが間違えているのか修正していただけないでしょうか? #include <stdio.h> int main(){ int z[3][3]; int w[3][3]; int x[3][3]={1,2,3,4,5,6,7,8,9}; int n,m; int i,j,k; printf("z[3][3] : \n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) {printf("z[%d][%d] = ",i,j); scanf ("%d",&z[i][j]); } } printf("m for [z]^m ="); scanf ("%d",&m); for(n=0;n<m;n++) { for(i=0;i<3;i++) { for(j=0;j<3;j++) { w[i][j] = 0; for(k=0;k<3;k++) { w[i][j] += x[i][k]*z[k][j]; } } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { x[i][j] = w[i][j]; } } printf("[z]^%d\n",n+1); for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf(" %9d",x[i][j]); }printf("\n"); }printf("\n"); } return 0; }

  • 加算の繰り上がり部分を高速に計算

    int型の変数a,bの加算を行う場合、 繰り上がり部分の処理が面倒ですが、 以下のようなコードを書きました。 cが繰り上がり部分となります。 #include <stdio.h> int main() { int a=1111; int b=458778; int N=31; int c=0; int flg=0; int bit=1; for(int i=0;i<N;i++){ if(flg)c^=bit; int ai=a & bit; int bi=b & bit; if(!flg && ai && bi)flg=1; else if(flg && !ai && !bi){ flg=0; } bit<<=1; } printf("%d\n",a+b); printf("%d\n",a^b^c); } この処理を可能な限り早く行いたいのですが、 どのような手法があるでしょうか?

  • 2進数の加算の繰り上がり

    2進数の四則演算のプログラムを作りたいと思い、2進数を表示するところまではできたのですが、加算になると繰り上がりという壁にぶつかってしまいました。繰り上がりや桁上げなどがよく分からないので、お教えください。(下のソースコードが繰り上がりのない加算をするまでのものです) #include <stdio.h> int main(void) { int a,b,i,j,x[8],y[8],z[8]; do{ puts("二つの符号なし整数を入力してください。(ただしa>bとし、bはのべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); if(a < = b) puts("入力した値がa>bになっていません。\a"); }while(a < = b); for( i = 0; i < = 7; i + +){ x[i] = a % 2; a = a / 2; y[i] = b % 2; b = b / 2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for( i = 7; i > = 0; i - -){ printf("%d",x[i]); } puts(""); printf("b="); for( i = 7; i > = 0; i - -){ printf("%d",y[i]); } printf("となります。\n\n"); printf("<加算>\n"); printf("c=a+b="); for( j = 7; j > = 0; j - -){ z[j]=x[j]^y[j]; printf("%d",z[j]); } return(0); }

  • C言語 2次元配列の積について

    <演習>  4行3列の行列と3行4列の行列の積を求めるプログラムを作成    せよ。各構成要素の値はキーボードから読み込むこと。  ここに出てくる「行列」とは、数学で出てくるあの「行列」のこと でしょうか。  そうなると私が作成したプログラムは意味が違ってきます。 4回同じ事をする様になっていて1回分の計算結果だけにしたいのですが、方法が分かりません。  入門レベルの知識しかありません。ご指導の程、お願いしたいで す。 下記、プログラムを送付します。 <プログラム> #include <stdio.h> int main(void) { int i,j=0; int o,p; int a[4][3]; int b[3][4]; int m[4][4]; for (i = 0;i < 4; i++){ for (j = 0; j < 3 ; j++) { printf("a[%d][%d] = ",i,j); scanf("%d",&a[i][j]); } } printf("\n"); for (i= 0; i < 3; i++){ for (j = 0; j < 4; j++){ printf("b[%d][%d] = ",i,j); scanf("%d",&b[i][j]); } } printf("\n"); for (o = 0; o < 4; o++){ for (p = 0; p < 4; p++){ for (j = 0; j < 4; j++){ for ( i=0 ; i < 4 ;i++ ) { m[o][p] = a[i][j] * b[i][j]; printf ("a[%d][%d] = %d ," ,i, j, a[i][j]); printf ("b[%d][%d] = %d ," ,i, j, b[i][j]); printf("m[%d][%d] = %d \n",o,p,m[o][p]); } } } } return 0; }