情報基礎II (第1回)

情報基礎Ⅱ/基礎工学Ⅲ
(第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
各領域の規格化
度数を計算
出力例:度数分布(エクセルによる表示)
釣り鐘型(正規分布)