我有一個向量 X ,其元素是零和一。我想創建另一個與 X 大小相同的向量 Z,如果 X 中的相應元素為零,則 Z 的每個元素都為 0,否則它是從 a 中隨機抽取的。均勻分布。在 Matlab 中,我可以通過以下方式輕松做到這一點:
n = 1000;
X = randi([0, 1], [1, n]);
Z(X) = rand(); #Here wherever X takes a value of 1, the element of Z is a draw from a uniform distribution.
我想在 Julia 中實作這一點。有沒有更簡潔的方法來代替使用 if 條件。謝謝!!
uj5u.com熱心網友回復:
這是一種方法:
julia> n = 1000;
julia> x = rand(Bool, n);
julia> z = zeros(n);
julia> using Distributions
julia> z[x] .= rand.(Uniform(-10, 10));
julia> z
100-element Vector{Float64}:
-2.6946644136672004
0.0
0.0
?
您可以根據需要調整分布的引數,或者如果默認范圍是您需要Uniform的,則將該引數排除在外。[0, 1)
該行z[x] .= rand.(Uniform(-10, 10))使用 Julia 的邏輯索引(與 MATLAB 相同)和廣播功能 - 對于每個x值,即true,進行rand呼叫并將結果分配給 的該元素z。
使用廣播的優點(與創建rand(Uniform(-10, 10), count(x))和分配z[x]例如相比)是值直接就地分配給它們的目的地 in z,因此沒有分配額外的不必要的記憶體。
uj5u.com熱心網友回復:
首先,您的 Matlab 代碼在 Matlab 中不起作用,原因有兩個:首先,因為邏輯索引必須是布林值,它們不能是 0 和 1。其次,因為Z(X) = rand()只會繪制一個亂數并將其分配給所有的對應元素Z。
相反,您可能想要這樣的 Matlab 代碼:
X = rand(1, n) > 0.5
Z(X) = rand(sum(X), 1)
在朱莉婭你可以做
X = rand(Bool, n)
Z = float.(X) # you have to initialize Z
Z[X] .= rand.()
編輯:這是一個理解的替代方案,您不需要初始化Z:
X = rand(Bool, n)
Z = [x ? float(x) : rand() for x in X]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/438431.html
