mutable/vector チュートリアル
小さなケース: 作業コピーで候補を採点する
moonbit
///|
fn score_candidate(
raw_features : @mutable.Vector[Int],
weights : @mutable.Vector[Int],
) -> Int {
let working = raw_features.copy()
working.map_inplace(fn(x) { x + 1 })
working.left_scale_inplace(2)
working.dot(weights)
}
///|
test "mutable vector tutorial case" {
let raw = @mutable.Vector::from_array([1, 2, 3])
let weights = @mutable.Vector::from_array([3, 4, 5])
let score = score_candidate(raw, weights)
inspect(raw, content="|1, 2, 3|")
inspect(score, content="76")
}これは可変ベクトルでよく使う形です。
- 呼び出し元が渡した元のベクトルは残す。
copy()で作業用バッファを作る。map_inplaceとleft_scale_inplaceで前処理する。- 最後に
dotで採点する。
推奨フロー
Vector::from_array、Vector::make、Vector::makeiでベクトルを作ります。v[i]とv[i] = xで要素を直接読み書きします。- 元の値を変更する意図がある場合は
map_inplace、left_scale_inplace、right_scale_inplaceを使います。 - 帰着、線形結合、行列変換には
dot、lin_comb、tensor_product、to_row_matrix、to_col_matrixを使います。
実践ガイド
- 元のベクトルを残したい場合は、
inplace接尾辞を持たないヘルパーを使います。 - 変更前の値も後で使うなら、先に
copy()を取ってからインプレース操作に入ります。 - ベクトルがより大きな数値処理に入ったら、
dot、lin_comb、行列変換ヘルパーへ進むと流れがつかみやすいです。