倭算数理研究所

科学・数学・学習関連の記事を、「倭マン日記」とは別に書いていくのだ!

commons-math 解読 (7) : DoubleArray, ResizableDoubleArray

今回はインターフェース DoubleArray とその実装クラス ResizableDoubleArray を見ていきます。

「DoubleArray インターフェース」は、基本的には double の配列を表す型ですが、データを扱う際に便利なメソッドが定義されています・・・と言っても、addElementRolling() メソッド以外は特にどうと言う程のものでもありません。

「ResizableDoubleArray クラス」は、commons-math が提供している唯一の DoubleArray の実装クラスです。

DoubleArray に定義されているメソッドは、簡単なサンプルで充分理解できると思います:

  • DoubleArray オブジェクトの取得
  • 要素へのアクセス
  • addElementRolling() メソッド

DoubleArray オブジェクトの取得

必要な要素が付加された DoubleArray オブジェクトを取得するには、

のどちらかでしょう:

import org.apache.commons.math.util.ResizableDoubleArray

// 空の DoubleArray を作成して、addElement() で要素を追加
def array1 = new ResizableDoubleArray()
array1.addElement(1d)
array1.addElement(2d)
array1.addElement(3d)
assert array1.getElements() == [1d, 2d, 3d] as double[]

// 配列を引数にとるコンストラクタから生成
def array2 = new ResizableDoubleArray([1d, 2d, 3d] as double[])
assert array2.getElements() == [1d, 2d, 3d] as double[]

要素へのアクセス

getElement() / setElement() は要素 (double) へのアクセッサ、getElements() は要素を配列として取得するメソッド、getNumElements() は要素の個数(size() にしとけ!)です:

import org.apache.commons.math.util.ResizableDoubleArray

// 要素の個数
assert array.getNumElements() == 3

// 要素へのアクセス
assert array.getElement(2) == 3d
array.setElement(1, 4d)

// 全ての要素を double[] として取得
assert array.getElements() == [1d, 4d, 3d] as double[]

特に問題なし。

addElementRolling() メソッド

これが DoubleArray インターフェースで唯一気を付けるメソッドかな。 動作は FIFO キューみたいな感じ。 引数の要素が配列の末尾に追加され、配列の先頭の要素が戻り値として返されます:

import org.apache.commons.math.util.ResizableDoubleArray

def array = new ResizableDoubleArray([1d, 2d, 3d] as double[])
assert array.addElementRolling(4d) == 1d
assert array.getElements() == [2d, 3d, 4d] as double[]
// 追加した要素は末尾へ。 先頭の要素は削除。

Javaによるアルゴリズム事典

Javaによるアルゴリズム事典