質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

4162閲覧

2つの配列の相関係数、ユークリッド距離の計算

meroy25

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/02/06 07:23

編集2017/02/06 07:58

###前提・実現したいこと
何度も質問してしまって申し訳ありません。
前回質問したプログラムのソースコードを、ご回答をもとに改良しました。
30人分の国語と英語の試験結果をもとに、各教科の平均点・最低点・最高点を計算し、さらに2つの教科の点数の相関係数、ユークリッド距離を求めるプログラムです。
各メソッドに計算式を当てはめることはできました。
###発生している問題・エラーメッセージ
foreach文を使って、
Corrメソッド(相関係数)では相関係数を導くために必要な値を
Distメソッド(ユークリッド距離)では偏差平方和を求めたいと思っています。
そのためには、入力した2つの配列(要素数30)を読み込まなければなりません。
しかし、それぞれforeachの下部に以下のようなエラーが出てしまいます。
正常に計算させるためにはどのような文にすればよいでしょうか。
ご助言いただけると幸いです。

型'int' を 'int[]'に変換できません。

###該当のソースコード

C#

1public class ExamResult 2 { 3 4 int[] points; 5 public int Sum { get; private set; } 6 7 public ExamResult(int[] p) 8 { 9 points = new int[p.Length]; 10 11 for (int i = 0; i < p.Length; i++) 12 { 13 points[i] = p[i]; 14 } 15 points = p; 16 17 foreach (var point in points) 18 { 19 Sum += point; 20 } 21 } 22 23 public double Avg() 24 { 25 if (points.Length==0) 26 { 27 return 0; 28 } 29 return Sum / (double)points.Length; 30 } 31 32 33 public int Min() 34 { 35 return points.Min(); 36 } 37 38 public int Max() 39 { 40 return points.Max(); 41 } 42 43 public double Stdv() 44 { 45 double sum2 = 0; 46 double mean = Sum/points.Length; 47 foreach (int i in points) 48 { 49 sum2 += Math.Pow(i-mean, 2); 50 } 51 double variance = sum2/points.Length; 52 return Math.Sqrt(variance); 53 } 54 public double Corr(ExamResult x) 55 { 56 if (points.Length <= 2) throw new ArgumentException("points.Length <= 2"); 57 int sumx, sumy, sumxx, sumxy, sumyy; 58 sumx = sumy = sumxx = sumxy = sumyy = 0; 59 foreach (int[] d in points) 60 { 61 sumx += d[0]; 62 sumy += d[1]; 63 sumxx += d[0] * d[0]; 64 sumxy += d[0] * d[1]; 65 sumyy += d[1] * d[1]; 66 } 67 var r = Math.Sqrt((points.Length * sumxx - sumx * sumx) * (points.Length * sumyy - sumy * sumy)); 68 return (points.Length * sumxy - sumx * sumy) / (r != 0 ? r : 1);//相関係数 69 } 70 71 public double Dist(ExamResult x) 72 { 73 int sumx, sumy; 74 sumx = sumy = 0; 75 foreach(int[] d in points) 76 { 77 sumx += d[0]; 78 sumy += d[1]; 79 80 } 81 double devsq =Math.Pow(sumx-sumy,2);//偏差平方和 82 return Math.Sqrt(devsq);//ユークリッド距離 83 } 84 85 86 87 } 88 89 90 91 class ExamResultTest 92 { 93 public static void Main() 94 { 95 ExamResult English = new ExamResult(new int[] { 80, 35, 45, 36, 78, 89, 67, 58, 37, 58, 53, 59, 50, 47, 58, 37, 19, 97, 86, 90, 10, 79, 37, 87, 45, 67, 68, 69, 65, 100 }); 96 ExamResult Japanese = new ExamResult(new int[] { 32, 55, 38, 25, 78, 80, 70, 48, 50, 42, 78, 63, 51, 40, 41, 67, 35, 86, 89, 75, 53, 45, 60, 30, 67, 43, 86, 73, 65, 90 }); 97 Console.WriteLine("英語の平均点は{0},最低点は{1},最高点は{2}",English.Avg(),English.Min(),English.Max()); 98 Console.WriteLine("英語の標準偏差は{0}", English.Stdv()); 99 Console.WriteLine("国語の平均点は{0},最低点は{1},最高点は{2}",Japanese.Avg(), Japanese.Min(), Japanese.Max()); 100 Console.WriteLine("国語の標準偏差は{0}", Japanese.Stdv()); 101 Console.WriteLine("英語と国語の相関係数は{0}",English.Corr(Japanese)); 102 Console.WriteLine("英語と国語のユークリッド距離は{0}", English.Dist(Japanese)); 103 104 105 } 106 }

###試したこと
CorrメソッドとDistメソッドのint[]部分をintに変更してみましたが、そうするとforeachの中の文が成立しませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio2015です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アドバイス

C#

1public double Corr(ExamResult x) // <- 引数がコード本体のどこにも出てこない = おかしい 2{ 3 if (points.Length <= 2) throw new ArgumentException("points.Length <= 2"); 4 int sumx, sumy, sumxx, sumxy, sumyy; 5 sumx = sumy = sumxx = sumxy = sumyy = 0; 6 foreach (int[] d in points) 7// <- pointに入っているものは何と定義しましたか? とある**1科目**の点数リストですよね? 8// 自分でそう定義しておいて、ここでなぜ2科目入っていると思ったんですか? 9 { 10 sumx += d[0]; 11 sumy += d[1]; 12 sumxx += d[0] * d[0]; 13 sumxy += d[0] * d[1]; 14 sumyy += d[1] * d[1]; 15 } 16 var r = Math.Sqrt((points.Length * sumxx - sumx * sumx) * (points.Length * sumyy - sumy * sumy)); 17 return (points.Length * sumxy - sumx * sumy) / (r != 0 ? r : 1); 18}

English.Corr(Japanese)で全然Japanese使ってませんね。
おかしいですね。
直しましょう。

能書きはいいから答えはよ

なるべく元のコードの雰囲気を残すと

C#

1public double Dist(ExamResult x) 2{ 3 if (points.Length <= 2) throw new ArgumentException("points.Length <= 2"); 4 var ls = points.Zip(x.points,(a,b)=>new[]{a,b}); 5 6 int sumx, sumy; 7 sumx = sumy = 0; 8 foreach(int[] d in ls) 9 { 10 sumx += d[0]; 11 sumy += d[1]; 12 13 } 14 double devsq =Math.Pow(sumx-sumy,2);//ところでこれがユークリッド距離なのかは疑問 15 return Math.Sqrt(devsq); 16}

投稿2017/02/06 07:34

編集2017/02/06 07:47
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meroy25

2017/02/06 08:02

早速参考にさせていただきました。 エラーも出ずに計算することができました。 ありがとうございます!
ozwk

2017/02/06 08:18

ところでこのMainにあるデータの場合 ユークリッド距離はいくつになって欲しいんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問