Cのプログラムに変換
どなたかこのプログラムをCに変化してくれる方いませんか?
なんで変換するのとかの質問はいらないです。
ただ純粋に変換してくれる方いませんか?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
#define NREPEAT 1000
int sweepout(float complex **a, int size) {
int n,m,k;
// 前進消去
for(n=0; n<size; n++) {
// 軸の選択
{
float amax = cabs(a[n][n]);;
float aabs;
int npivot = n;
for(m=n+1; m<size; m++) {
if((aabs = cabs(a[m][n]))>amax) {
npivot = m;
amax = aabs;
}
}
if(aabs == 0.0) return n;
if(npivot != n) { // 軸の交換
float complex t;
for(k=n; k<=size; k++) {
t = a[n][k];
a[n][k] = a[npivot][k];
a[npivot][k] = t;
}
}
}
// 消去
{
float complex t;
t = 1.0/a[n][n];
// 対角要素 a[n][n] <-- 1
for(k=n+1; k<=size; k++) a[n][k] *= t;
// 非対角要素 a[m][n] <-- 0
for(m=n+1; m<size; m++) {
for(k=n+1; k<=size; k++) a[m][k] -= a[m][n]*a[n][k];
}
}
}
// 後退代入
{
float t;
for(n=size-1; n>0; n--) {
for(m=0; m<n; m++) a[m][size] -= a[n][size]*a[m][n];
}
}
return -1;
}
// 乱数を発生する
double drand() {
double rn;
rn = (2*((double)random()))/((double)(RAND_MAX))-1.0;
return rn;
}
main(int argc, char **argv) {
int n, m, k, ncount;
double complex **a0;
float complex **a;
double complex t;
double d, r;
if(argc>1) n = atoi(argv[1]);
if(n <=0) n = 3;
srandom((argc>2)?atoi(argv[2]):0);
a0 = (double complex **)malloc(n*sizeof(double complex *));
for(m=0; m<n; m++)
a0[m] = (double complex *)malloc((n+1)*sizeof(double complex));
a = (float complex **)malloc(n*sizeof(float complex *));
for(m=0; m<n; m++)
a[m] = (float complex *)malloc((n+1)*sizeof(float complex));
for(ncount=0; ncount<NREPEAT; ncount++) {
// 乱数により、配列の係数を決める(double型)
for(m=0; m<n; m++)
for(k=0; k<=n; k++)
a0[m][k] = drand() + 1.0I*drand();
// 係数をfloat型に変換し、配列 a に代入する
for(m=0; m<n; m++) {
for(k=0; k<n; k++)
a[m][k] = (float complex)a0[m][k];
t = 0;
for(k=0; k<n; k++) t += a0[m][k]*a0[k][n];
a[m][n] = (float complex)t;
}
// 連立方程式を解き、数値解を a[][n] に求める
sweepout(a,n);
// 2乗誤差を求める
d = r = 0;
for(m=0; m<n; m++) {
d += pow(cabs(a[m][n]-a0[m][n]),2);
r += pow(cabs(a0[m][n]),2);
}
printf("%lf\t\n", 0.5*log10(d/r));
}
for(m=0; m<n; m++) {
free(a0[m]);
free(a[m]);
}
free(a0);
free(a);
}
お礼
なるほど。そうだったんですか! 参考になります。