相関係数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yman
記事: 9
登録日時: 9年前

相関係数について

#1

投稿記事 by yman » 9年前

相関係数のプログラムを教えて頂きたいです。
「double型の配列a,bが与えられているデータがあり、それぞれの配列の長さは百万である。
相関係数を求める直列アルゴリズムをC言語で書きなさい」
以下相関係数を求めるサンプルプログラムです。
どのようにプログラムを変えれば良いか教えて下さい。

コード:

#include "serial.h"
#include "math.h"

int main() {
int x[100], y[100], xy[100], xsquare[100], ysquare[100];
int i, n, xsum, ysum, xysum, xsqr_sum, ysqr_sum;
float coeff, num, deno;

xsum = ysum = xysum = xsqr_sum = ysqr_sum = 0;

/* get the number of entries from the user */
printf("Enter the value for n:");
scanf("%d", &n);

/* get the values for x and y from the user */
printf("Enter the value for x and y:\n");
for (i = 0; i < n; i++) {
printf("x[%d] and y[%d]: ", i, i);
scanf("%d%d", &x[i], &y[i]);
}

/* find the needed data to manipulate correlation coeff */
for (i = 0; i < n; i++) {
xy[i] = x[i] * y[i];
xsquare[i] = x[i] * x[i];
ysquare[i] = y[i] * y[i];
xsum = xsum + x[i];
ysum = ysum + y[i];
xysum = xysum + xy[i];
xsqr_sum = xsqr_sum + xsquare[i];
ysqr_sum = ysqr_sum + ysquare[i];
}

num = 1.0 * ((n * xysum) - (xsum * ysum));
deno = 1.0 * ((n * xsqr_sum - xsum * xsum)* (n * ysqr_sum - ysum * ysum));

/* calculate correlation coefficient */
coeff = num / sqrt(deno);

/* print the result */
printf("Correlation Coefficient : %.4f\n", coeff);
return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 相関係数について

#2

投稿記事 by みけCAT » 9年前

yman さんが書きました:以下相関係数を求めるサンプルプログラムです。
どのようにプログラムを変えれば良いか教えて下さい。
既に直列アルゴリズム(ググっても定義がよくわかりませんでしたが、並列でない計算方法?)になっていそうですし、既にC言語のプログラムであるようなので、
  • 配列の長さを百万にする。スタックオーバーフローが発生するようなら静的変数にするか、mallocを用いた動的確保にする
  • 配列の要素や計算に用いる変数の型をintからdoubleにする
  • printf("x[%d] and y[%d]: ", i, i);などの無駄な出力を消す (さすがに百万行手入力はしないですよね?)
  • データの読み込みかた(書式指定文字列など)を必要に応じて調整する
  • インデントを整える
  • stdio.hをインクルードする
  • #include "math.h"を#include <math.h>にすることで、システムのライブラリを優先して検索させる
  • int main()をint main(void)に変える
という感じだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yman
記事: 9
登録日時: 9年前

Re: 相関係数について

#3

投稿記事 by yman » 9年前

みけCATさん返信ありがとうございます。
教えて頂いた項目をいくつか適用した結果エラーが起こってしまいます。同時に初心者の為、インデントを整える等の用語が理解できません。
差し支えなければ教えて頂けると幸いです。
添付ファイル
スクリーンショット 2015-10-31 13.42.29.png
プログラム画面です。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 相関係数について

#4

投稿記事 by みけCAT » 9年前

yman さんが書きました:教えて頂いた項目をいくつか適用した結果エラーが起こってしまいます。
iやnは添字を管理しているため、double型にしてはいけません。

コード:

#include <stdio.h>
#include <math.h>

#define ARRAYNUM 1000000

int main(void) {
	static double x[ARRAYNUM], y[ARRAYNUM], xy[ARRAYNUM], xsquare[ARRAYNUM], ysquare[ARRAYNUM];
	int i, n;
	double xsum, ysum, xysum, xsqr_sum, ysqr_sum;
	float coeff, num, deno;

	xsum = ysum = xysum = xsqr_sum = ysqr_sum = 0;

	/* get the number of entries from the user */
	scanf("%d", &n);

	/* get the values for x and y from the user */
	for (i = 0; i < n; i++) {
		scanf("%lf%lf", &x[i], &y[i]);
	}

	/* find the needed data to manipulate correlation coeff */
	for (i = 0; i < n; i++) {
		xy[i] = x[i] * y[i];
		xsquare[i] = x[i] * x[i];
		ysquare[i] = y[i] * y[i];
		xsum = xsum + x[i];
		ysum = ysum + y[i];
		xysum = xysum + xy[i];
		xsqr_sum = xsqr_sum + xsquare[i];
		ysqr_sum = ysqr_sum + ysquare[i];
	}

	num = 1.0 * ((n * xysum) - (xsum * ysum));
	deno = 1.0 * ((n * xsqr_sum - xsum * xsum)* (n * ysqr_sum - ysum * ysum));

	/* calculate correlation coefficient */
	coeff = num / sqrt(deno);

	/* print the result */
	printf("Correlation Coefficient : %.4f\n", coeff);
	return 0;
}
yman さんが書きました:同時に初心者の為、インデントを整える等の用語が理解できません。
インデントとは|indent - 意味/解説/説明/定義 : IT用語辞典
インデントはできているようですが、具体的にどの用語がわからないですか?
Googleなどを利用して自分で調べるのもいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yman
記事: 9
登録日時: 9年前

Re: 相関係数について

#5

投稿記事 by yman » 9年前

みけCATさん、インデント等の用語は理解いたしました。先ほど書いて頂いたプログラムを実行した所、エラーは発生しませんが動きません。これがスタックオーバーフローというものなのでしょうか。その場合、静的変数にするという事はどのようにすればよいのでしょうか。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 相関係数について

#6

投稿記事 by みけCAT » 9年前

yman さんが書きました:先ほど書いて頂いたプログラムを実行した所、エラーは発生しませんが動きません。これがスタックオーバーフローというものなのでしょうか。その場合、静的変数にするという事はどのようにすればよいのでしょうか。
すでに静的変数にはしてあるはずですし、動くはずです。
http://melpon.org/wandbox/permlink/Wdspqrdy20YqazXt
ウイルス対策ソフトのせいでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yman
記事: 9
登録日時: 9年前

Re: 相関係数について

#7

投稿記事 by yman » 9年前

みけCATさん、本当にありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る