2017-01-16 9 views
2

Iが1Dアレイのでように持っていると仮定する。乗算independenly描か乱数によるアレイの一部のメンバー

julia> mymask = [true; true; false; false; false; false;] 
6-element Array{Bool,1}: 
    true 
    true 
false 
false 
false 
false 

は今、私は同じ分布から引き出される乱数によってのみ第1および第2の要素を乗算し、古い配列上で、結果を保存したいです。しかし、これは同じ値によってそれらを乗算します:

julia> myarray[mymask] = myarray[mymask] * rand(Normal(20,5)) 
julia> myarray 
6-element Array{Float64,1}: 
16.5642 
16.5642 
    1.0 
    1.0 
    1.0 
    1.0 

私の次の思考がmyarray[mymask] = myarray[mymask] * rand(Normal(20,5),2)を試してみましたが、それはエラーが発生します。

答えて

3

行以上のコスト、次のような作品では:

function mularray!(myarray,mymask) 
    maskpos = find(mymask) 
    myrand = rand(Normal(20,5),length(maskpos)) 
    for i=1:length(maskpos) 
    myarray[maskpos[i]] *= myrand[i] 
    end 
end 

julia> mularray!(myarray,mymask) 
julia> myarray 
6-element Array{Float64,1}: 
22.1761 
20.836 
    1.0 
    1.0 
    1.0 
    1.0 

によって行わ必要な操作で利点は、スピード(ベンチマークの2倍以上の短いソリューション)、おそらく可読性(som eリーダー)が、おそらく他の突然変異操作のための柔軟性を提供する。

+1

バージョン0.6が登場するまで速度の優位性はありませんか?そして、 '。*'は融合するでしょう。 – DNF

+0

これは実際には他のソリューションよりも高速なので、私はそれを選択しています。しかし、私は興味があります。このようなループのようなものはおそらく私が最終的に自分のデバイスに残したのだろう。私はそれが最速の方法ではないと思っていたでしょう。また、 "!"関数定義の意味ですか? –

+0

感嘆符は単に[Julia style convention]です(http://docs.julialang.org/en/release-0.5/manual/style-guide/#append-to-names-of-functions-that-modify-彼らの議論)。関数がその引数の1つまたは複数を変更することを示します。 –

5

明示的要素ごとあなたの乗算を行うことができます。

julia> myarray[mymask] .*= rand(Normal(20,5), size(myarray[mymask])); 

julia> myarray 
6-element Array{Float64,1}: 
24.1747 
12.6375 
    1.0 
    1.0 
    1.0 
    1.0 
+0

感謝の割り当てを回避することができます使用することができますこの方法の潔白さはとてもいいです、私はそれが私のマシンで少し速いので、もう1つを選択しました。 –

+0

@BenS。未来への賛辞として、ベクトル化された乗算はJulia v0.6ではおそらくv0.5より早いことに注意してください。コードをv0.6に移行する場合は、コードの速度が変わる可能性があるため、DSMの提案を再試行することをおすすめします。 –

0

マスクの値がブール値であるので、以下の方法は、それがこの方法で

for i in eachindex(arr) 
    if mask[i] 
     arr[i] *= rand(Normal(20, 5)) 
    end 
end 

と同等です

for i in eachindex(arr) 
    mask[i] && (arr[i] *= rand(Normal(20,5))) 
end 

、あなたがarr[mask]