多次元数値配列クラス NArray を使った配列演算を体験します. これを使うと,大量の数値を扱う計算が Ruby 上で簡単かつ高速にできるようになります. NArray は GPhys の重要な基礎部分です. NArray と GPhys とは,配列としては同じ構造をもっています. NArray に座標という概念や属性,名前といった要素を加えて拡張したものが GPhys だといえます.
目次
Ruby という言語 で見たように,Ruby に標準装備されている配列 (Array) は,オブジェクトを順番に並べたものであり,これもまた1つのオブジェクトでした. 配列の要素は同じ型である必要はなく任意のオブジェクトを格納できるという柔軟なものなので,その分計算速度は犠牲になっています. そこでわれわれが数値計算をするときには NArray というクラスパッケージを用いることにします.
NArray クラスを用いるには,まず,
require "narray"
としましょう.これで NArray クラスの定義が読み込まれます.
新たに配列を生成する(つまり NArray クラスのオブジェクトを新たに生成する)には, NArray.new("型",大きさ,大きさ,...) とします. が,通常はそれより簡単な NArray.型(大きさ,大きさ,...) を用います. たとえば 3x4 の単精度実数配列 ary1 を作るには,
ary1 = NArray.sfloat(3,4)
です. これだけでは中身の値はすべて0です. 次にこの配列オブジェクトに中身をセットするメソッドを作用させます.
ary2 = NArray.sfloat(6).fill(3.0) # 長さ 6 の配列で,中身はすべて 3.0 ary3 = NArray.sfloat(10).indgen! # 1 ずつ増やした値をセットする
また、Array と NArray の間で型変換するには,
irb(main):005:0> ary4 = [ 2, 3, 4.5, 8 ] # 通常の配列 ary5 = NArray.to_na(ary4) # ary4 を NArray に変換 ary6 = ary5.to_a # ary5 を Array に変換
とします. NArray では,例えば中に1つでも実数が含まれていれば実数の配列となり,要素はすべて実数になります.
インデックスは Array や C言語と同じで,最初の要素番号は0,最後の要素番号は 要素数-1 です. 多次元のインデックスの順序は FORTRAN と同じで,前の要素から数字を増やします.
ary7 = NArray.sfloat(4,3).indgen! ary7[0,0] # 最初の要素 ary7[1,0] # 次の要素 ary7[1..2,0..-1] # 範囲取り出し ary7[true,1] # trueは 0..-1 と同じ ary7[0..1,0] = 999 # 値の代入 ary7
演算は要素ごとにやってくれます. 同じ演算子であっても Array の場合と動作が違うことに注意してください.
ary8 = NArray.sfloat(4,3).fill!(3.0) ary7 + ary8 ary7 * ary8 ary7 % ary8 ary7 - 1.5 ary7 ** 2
NArray クラスには,平均・標準偏差などの統計計算や要素の並べかえなど,いろいろなメソッドが用意されています. NArrayのメソッド一覧 を参照しながら,以下の演習問題をやってみましょう.
笑介くんのクラス20人のテストの点数は,理科が
65, 80, 67, 35, 58, 60, 72, 75, 68, 92, 36, 50, 2, 58.5, 46, 42, 78, 62, 84, 70
英語が
44, 87, 100, 63, 52, 60, 58, 73, 55, 86, 29, 56, 89, 23, 65, 84, 64, 27, 86, 84
でした. クラス全体での平均点,標準偏差を教科別に求めなさい. また,理科・英語の合計点について,各人の偏差値を求めなさい.
[次へ進む]