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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1215閲覧

CSVファイルの配列への挿入

esodermaso

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/05/08 13:21

編集2019/05/08 23:09

前提・実現したいこと

パーセプトロンを使い論理回路の学習を行った後に
CSVファイルを読み込み、それをパーセプトロンに(fname1:学習用データ)インプット及び学習させ、その後
別のCSVファイル(fname2:教師データ)を使い正答率を確認するプログラムを作成中にCSVのデータを配列に格納出来ていないが発生しました。

発生している問題・エラーメッセージ

(ソースコード後半のsrand()以降のteacher部分において) CSVファイル読み込み自体は行えても、配列に格納すら出来ていないので、その方法。

該当のソースコード

C言語

1#include<stdio.h> 2#include<stdlib.h> 3#include<time.h> 4#include<math.h> 5 6#define INPUTSIZE 2 7 8 9#define LOOPNUM 10 10 11 12double Forward(double *input, int ni, double wio[ni]); 13int Backward(double *input, double output, int ni, 14 double wio[ni], double eta, double teacher); 15 16 17 18 19double Forward(double *input, int ni, double wio[ni]) 20{ 21 double sum = 0.0; 22 int i = 0; 23 double thata = 0.1; 24 for(i = 0;i<=ni;i++) 25 sum+=input[i]*wio[i]; 26 if (sum > thata)return 1; 27 else return 0; 28//�����菇���ɏ]���R�[�f�B���O���s������ 29} 30 31int Backward(double *input, double output, int ni, 32 double wio[ni], double eta, double teacher) 33{ 34 int i = 0; 35 for (i = 0;i <= ni;i++) 36 wio[i] += eta * (teacher - output)*input[i]; 37 return 0; 38//�����菇���ɏ]���R�[�f�B���O���s������ 39} 40 41//AND 42double teacher[4][3] = { 43 {0., 0., 0.}, 44 {1., 0., 0.}, 45 {0., 1., 0.}, 46 {1., 1., 1.} 47}; 48 49//OR 50/*double teacher[4][3] = { 51 {0., 0., 0.}, 52 {1., 0., 1.}, 53 {0., 1., 1.}, 54 {1., 1., 1.} 55};*/ 56 57//XOR 58/*double teacher[4][3] = { 59 {0., 0., 0.}, 60 {1., 0., 1.}, 61 {0., 1., 1.}, 62 {1., 1., 0.} 63};*/ 64 65 66 67int main(int argc, char *argv[],double teacher) 68{ 69 double input[INPUTSIZE], output; 70 double weight_io[INPUTSIZE]; 71 double rms=0.; 72 int i, j,i_rms=0; 73 int *j = 74 FILE *fp; 75 char *fname1 = "learning1.csv"; 76 float n1, n2; 77 int ret, n3; 78 79 fp = fopen(fname1, "r"); 80 if (fp == NULL) { 81 printf("%sファイルが開けません¥n", fname1); 82 return -1; 83 } 84 85 while ((ret = fscanf(fp, "%f,%f,%d", &n1, &n2, &n3)) != EOF) { 86 printf("%f %f %d\n", n1, n2, n3); 87 } 88 89 char *fname2 = "test1.csv"; 90 float m1, m2; 91 int let, m3; 92 93 fp = fopen(fname2, "r"); 94 if (fp == NULL) { 95 printf("%sファイルが開けません¥n", fname2); 96 return -1; 97 } 98 99 while ((let = fscanf(fp, "%f,%f,%d", &m1, &m2, &m3)) != EOF) { 100 printf("%f %f %d\n", m1, m2, m3); 101 } 102 fclose(fp); 103 104 srand(1); 105 106 for(i=0; i<INPUTSIZE; i++) 107 { 108 weight_io[i] = ((double)rand()/RAND_MAX)/10; 109 } 110 for(i=0; i<LOOPNUM; i++){ 111 for (j = 0; j < 4; j++) { 112 input[0] = teacher[j][0]; 113 input[1] = teacher[j][1]; 114 output = Forward(input, INPUTSIZE, weight_io); 115 Backward(input, output, INPUTSIZE,weight_io, 0.01, teacher[j][2]); 116 } 117 } 118 119 120 for(i=0; i<=1; i++){ 121 for(j=0; j<=1; j++){ 122 input[0] = i; 123 input[1] = j; 124 output=Forward(input, INPUTSIZE, weight_io); 125 rms+=(teacher[i*(2)+j][2]-output)*(teacher[i*(2)+j][2]-output); 126 i_rms++; 127 printf("INPUT: %d %d OUTPUT: %f %f\n", i, j,output,(teacher[i*(2)+j][2])); 128 } 129 } 130 131 printf("LOOPNUM:%d RMS:%f\n",LOOPNUM,sqrt(rms)/i_rms); 132 133 134 return 0; 135} 136 137 138

試したこと

teacherの後が宣言されていないと考え、int[]などでポインタを作成しようとしましたがダメでした。

補足情報(FW/ツールのバージョンなど)

作成はVS code,コンパイルなどは仮想LinuxのC言語で行っています。

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

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

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

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

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

jimbe

2019/05/08 16:19

コンパイルエラーが出て実行できません. まずはコンパイルできるコードに修正願えますか.
guest

回答2

0

ベストアンサー

これならしっかりと関数化してしまった方が良さそうですよ。
読んでいる限り、"learning1.csv"と"test1.csv"は同じプログラムなので、関数で纏めましょう。
"n1","n2","n3"も構造体で纏めてしまいましょう。
その辺は勉強がてら自分で調べて下さい。
あとはepistemeさんもおっしゃているように、配列で格納していきましょう。

C

1//この様に構造体を作ることで可読性が増しますよ。 2struct person { 3 int n1; 4 int n2; 5 float n3; 6};

投稿2019/05/09 00:57

stdio

総合スコア3307

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

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

0

CSVから読みこみ、配列に格納していないんですけど...
あと変数 teacher はどこで宣言してます?

投稿2019/05/08 19:42

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問