情報基礎Ⅱ/基礎工学Ⅲ (第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)) 配列の引数には, 整数型の式,関数 なども許される 配列の宣言 二次元,整数型 の配列の宣言 b(0,0)~b(0,8) b(1,0)~b(1,8) … b(8,0)~b(8,8) Dim a(10) As Single Dim b(8,8) As Integer Dim c(3,5) As String 一次元, 単精度整数型 の配列の宣言 a(0)~a(10) • 配列の番号は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 1 2 3 4 5 6 7 8 9 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 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を計算するプログラムを作れ. 2 1 4 A 0 3 2 2 1 1 data_a.txt -2 1 4 0 3 -2 2 -1 1 1 2 3 B 3 0 2 0 1 5 data_b.txt 1 2 -3 -3 0 2 0 -1 5 行列の積:出力例 行ごとに 改行する 行列の積:プログラム例 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 行列データの Next 読み込み ReadText1.Close() ReadText2.Close() ファイルを閉じる 行列の積:プログラム例(続き) For i As Integer = 1 To n For j As Integer = 1 To n 積の(i,j)成分の計算 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 Next Next CSV形式のファイルからのデータ読み込み data.csv 1, 2, 3, 4, 5, 10 20 30 40 50 a(1,0)=1, a(2,0)=2, a(3,0)=3, a(4,0)=4, a(5,0)=5, a(1,1)=10 a(2,1)=20 a(3,1)=30 a(4,1)=40 a(5,1)=50 CSV形式からのデータ読み込み:プログラム例 Dim ReadText As New IO.StreamReader( _ "D:\...\data.csv", System.Text.Encoding.Default) Dim s, items(10) As String データ1行を文字列のsへ, Dim a(10, 10) As Single 分割して配列のitems()へ For i As Integer = 1 To 5 s = ReadText.ReadLine() items = Split(s, ",") For j As Integer = 0 To 1 a(i, j) = CSng(items(j)) Next j データを格納する配列 sをコンマの位置で区切る 文字列から 単精度実数型へ Console.WriteLine("a({0},0)={1,4}, a({0},1)={2,4}", _ i, a(i, 0), a(i, 1)) Next i ReadText.Close() データの型の変更 • Cint(x): xを整数型へ変換 • CStr(x): xを文字列へ変換 • CSng(x): xを単精度実数型へ変換 • CDbl(x): xを倍精度実数型へ変換 • CBool(x): xを論理型へ変換 データの統計処理に関する諸問題 • データの分布の様子 • データの期待値(平均値) • データの分散,標準偏差(ばらつきの度合い) • 回帰直線へのフィッティング(最小二乗法) • 一様乱数の発生 • 正規乱数への変換 • モンテカルロシミュレーション 例題:度数分布 n個のデータx1, x2, …, xnが与えられている. ‘normal_data.txt’よりデータを逐次読み込んで, 次の区分に従って度数分布を調べよ. • x<-2.25 • 0.25≦x< 0.75 • -2.25≦x<-1.75 • 0.75≦x< 1.25 • -1.75≦x<-1.25 • 1.25≦x< 1.75 • -1.25≦x<-0.75 • 1.75≦x< 2.25 • -0.75≦x<-0.25 • 2.25≦x • -0.25≦x< 0.25 度数分布:考え方 • それぞれ領域を以下のように定める. 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 • データを読み込んで,領域iに当てはまるとき, c(i)の値を1増やす. • p(i)=c(i)/nの値を計算し,書き出す. 出力例:度数分布 度数分布:プログラム例 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 各領域の規格化 度数を計算 出力例:度数分布(エクセルによる表示) 釣り鐘型(正規分布)
© Copyright 2024 ExpyDoc