【Julia】マスクしたベクトルへの値の代入

ベクトルにおいて指定した index に値を代入することは、それなりにあると思います。Julia において、それを実現しようと思ったのですが、値が上手く代入できずに悩み試行錯誤しました。備忘の意味を込めて、記事として残します。

マスクしたベクトルへの値の代入

ベクトルをマスクするというのは、本記事では以下のことを指します。

tmp_vec = [1,3,2,5,6,7,10]
index_set = [1,2,3]

print(tmp_vec[index_set])

>[1, 3, 2]

ここで問題となるのは以下のような場合です。

tmp_vec = [1,3,2,5,6,7,10]
index_set = [1,2,3]
tmp_vec[index_set][1] = 100
print(tmp_vec)

>[1, 3, 2, 5, 6, 7, 10]

マスクしたベクトルの任意の位置への値の代入を行った場合、元のベクトルにはその変更が反映されません。その理由としては、マスクされたベクトルは、別のベクトルとしてメモリを確保してしまうことが原因だと思われます。

解決方法

直接の解決方法は以下のようになります。

tmp_vec = [1,3,2,5,6,7,10]
index_set = [1,2,3]
@views tmp_vec[index_set][1] = 100
print(tmp_vec)

>[100, 3, 2, 5, 6, 7, 10]

@views を用いることで、tmp_vec[index_set] が別のメモリに格納されず、元のベクトルを用いるようになるのだと思います(解釈が違ったらすいません)

まとめ

マスクしたベクトルに対する値の代入について記載しました。マスクしたベクトルにおいて index を指定して値を代入しようとすると、元のベクトルにはその変更は反映されないという結果です。ただし、マスクしただけなら以下のように値が代入できることには気をつけてください。

tmp_vec[index_set] .= 100
print(tmp_vec)
>[100, 100, 100, 5, 6, 7, 10]

あくまでも、マスクしたベクトルに対して、さらに index を指定した場合の変更です。

この記事が気に入ったらサポートをしてみませんか?