情報工学Ⅱ (第9回) 月曜4限 担当:北川 晃
配列とは? 表を一つの変数のように扱う 一次元の配列: → a(i) ベクトル 二次元の配列: → b(i,j) 行列
配列の引数には,整数型の式,関数なども許される 配列の表記法 配列内の個々のデータ(配列要素)は, 配列名に添え字を付けて表す. alpha(16) n(5,1) p(i,j) b(i+1) x(2*n-1) k(l(m)) 配列の引数には,整数型の式,関数なども許される 配列の宣言 一次元, 単精度実数型 の配列の宣言 a(0)~a(10) Dim a(10) As Single Dim b(8,8) As Integer Dim c(3,5) As String 二次元,整数型の配列の宣言 b(0,0)~b(0,8) b(1,0)~b(1,8) … b(8,0)~b(8,8) 配列の番号は0から始まる 使わない要素は0と見なされるだけなので, 少し余裕を見て大きめに宣言するとよい
配列の操作 配列Aの内容をBにコピーする(下限1,上限N). For i As Integer = 1 To n b(i)=a(i) Next 行列A,Bの和を作ってCに代入する(M行N列とする). For i as Integer = 1 To m For j As Integer = 1 To n c(i,j) = a(i,j) + b(i,j) Next j Next i
例題:九九の表 九九の表を書き出すプログラムを作れ. 1 2 3 4 5 6 7 8 9
九九の表:プログラム例 行ごとに改行する
行列の積:プログラム例 Console.Title = "九九の表" Dim i, j, kuku(9, 9) As Integer For j = 1 To 9 For i = 1 To 9 kuku(i, j) = i * j If i <> 9 Then Console.Write("{0,4}", kuku(i, j)) Else Console.WriteLine("{0,4}", kuku(i, j)) End If Next 表の右端で改行する
ベクトルの内積 ベクトルAとベクトルBの内積を計算する(下限1,上限N). s = 0.0 For i As Integer = 1 To n s = s + a(i) * b(i) Next
行列の積の成分計算 行列Aと行列Bの積を計算する(下限1,上限N). 第(i,j)成分は・・・ s = 0.0 For k As Integer = 1 To N s = s+a(i,k)*b(k,j) Next k
プログラミング演習 3×3の正方行列A,Bを外部ファイルからデータとして 読み込み,その積C=ABを計算するプログラムを作れ. data_a.txt -2 1 4 3 2 -1 1 2 -3 -1 5 data_b.txt
行列の積:出力例 行ごとに改行する
Streamクラスを用いたファイルの接続 プログラム中における ファイルの名前 … Dim インスタンス名 As New IO.StreamReader( _ “ファイルの絶対パス”, _ System.Text.Encoding.Default) s = インスタンス名. インスタンス名.Close() ReadToEnd:ファイルの内容すべてを取得 ReadLine:ファイルから1行読み込む Read :ファイルから1文字読み込む ファイルを閉じる
外部ファイルからのデータの読み込み:例文 Dim a, b, c As Single Dim ReadText As New IO.StreamReader( _ “D:\read_test\data.txt”, _ System.Text.Encoding.Default) a = ReadText.ReadLine() b = ReadText.ReadLine() c = ReadText.ReadLine() Console.WriteLine(“a={0}”,a) Console.WriteLine(“b={0}”,b) Console.WriteLine(“c={0}”,c) ReadText.Close() 1行ずつ 読み込み ファイル名”data.txt”として “D:\read_test\”に保存 3.141592656 2.718281828 1 ファイル を閉じる
外部ファイルからのデータの読み込み:出力例
行列の積:プログラム例 Dim ReadText1 As New IO.StreamReader( _ "D:\...\data_a.txt", System.Text.Encoding.Default) Dim ReadText2 As New IO.StreamReader( _ "D:\...\data_b.txt", System.Text.Encoding.Default) Dim n As Integer = 3 Dim a(10, 10), b(10, 10), c(10, 10) As Single For i As Integer = 1 To n For j As Integer = 1 To n a(i, j) = ReadText1.ReadLine() b(i, j) = ReadText2.ReadLine() Next ReadText1.Close() ReadText2.Close() 二つの外部 ファイルを接続 配列の宣言 (サイズは大きめに) 行列データの 読み込み ファイルを閉じる
行列の積:プログラム例(続き) For i As Integer = 1 To n For j As Integer = 1 To n c(i, j) = 0.0 For k As Integer = 1 To n c(i, j) = c(i, j) + a(i, k) * b(k, j) Next If j <> n Then Console.Write("{0,10}", c(i, j)) Else Console.WriteLine("{0,10}", c(i, j)) End If 積の(i,j)成分の計算 行の右端で改行する
データの統計処理に関する諸問題 データの分布の様子 データの期待値(平均値) データの分散,標準偏差(ばらつきの度合い) 回帰直線へのフィッティング(最小二乗法) 一様乱数の発生 正規乱数への変換 モンテカルロシミュレーション
例題:度数分布 n個のデータx1, x2, …, xnが与えられている. ‘normal_data.txt’よりデータを逐次読み込んで, 次の区分に従って度数分布を調べよ. x<-2.25 -2.25≦x<-1.75 -1.75≦x<-1.25 -1.25≦x<-0.75 -0.75≦x<-0.25 -0.25≦x< 0.25 0.25≦x< 0.75 0.75≦x< 1.25 1.25≦x< 1.75 1.75≦x< 2.25 2.25≦x
度数分布:考え方 それぞれ領域を以下のように定める. x<-2.25:領域0 -2.25≦x<-1.75:領域1 データを読み込んで,領域iに当てはまるとき, c(i)の値を1増やす. p(i)=c(i)/nの値を計算し,書き出す. x<-2.25:領域0 -2.25≦x<-1.75:領域1 -1.75≦x<-1.25:領域2 … :… 1.75≦x< 2.25:領域9 2.25≦x :領域10
出力例:度数分布
度数分布:プログラム例 読み込んだ値がどの領域に属するか判定 Dim n, c(100) As Integer, x, p(100) As Single Dim ReadText As New IO.StreamReader( _ "D:\…\normal_data.txt", System.Text.Encoding.Default) For i As Integer = 0 To 10 c(i) = 0 Next n = ReadText.ReadLine() For i As Integer = 1 To n x = ReadText.ReadLine() If x < -2.25 Then c(0) = c(0) + 1 ElseIf -2.25 <= x And x < -1.75 Then c(1) = c(1) + 1 ElseIf -1.75 <= x And x < -1.25 Then c(2) = c(2) + 1 読み込んだ値がどの領域に属するか判定
度数分布:プログラム例(続き) 読み込んだ値がどの領域に属するか判定 ElseIf -1.25 <= x And x < -0.75 Then c(3) = c(3) + 1 ElseIf -0.75 <= x And x < -0.25 Then c(4) = c(4) + 1 ElseIf -0.25 <= x And x < 0.25 Then c(5) = c(5) + 1 ElseIf 0.25 <= x And x < 0.75 Then c(6) = c(6) + 1 ElseIf 0.75 <= x And x < 1.25 Then c(7) = c(7) + 1 ElseIf 1.25 <= x And x < 1.75 Then c(8) = c(8) + 1 ElseIf 1.75 <= x And x < 2.25 Then c(9) = c(9) + 1 Else c(10) = c(10) + 1 End If Next 読み込んだ値がどの領域に属するか判定
度数分布:プログラム例(続き) 各領域の規格化度数を計算 For i As Integer = 0 To 10 p(i) = c(i) / n Console.WriteLine("p({0})={1}", i, p(i)) Next
出力例:度数分布(エクセルによる表示) 釣り鐘型(正規分布)