Conditional Assignment in Julia
在R中,我可以有条件地分配如下值:
1 2 3 4 5 6 7 8 9 10 | A = matrix(c(1,2,3,4), ncol = 2) A = 1 3 2 4 A[,1][A[,2] == 3] = 1000 A = 1000 3 2 4 |
在Julia中,此相同格式无效。
1 2 3 4 5 6 7 8 9 10 | A = [1 3; 2 4] A = 1 3 2 4 A[:,1][A[:,2] .== 3] = 1000 A = 1 3 2 4 |
我似乎无法弄清楚发生了什么。 有人可以帮忙吗?
编辑:谢谢。 这可以用一个值替换另一个值,例如1替换为1000。但是不会替换多个。 这是为什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | >A = [1 3 5; 2 4 6] >A 1 3 5 2 4 6 >A1 = sub(A, :, 1) >A1 1 2 >A2 = sub(A, :, 2) >A2 3 4 >A1[A2 .> 2] = 1000 1000 >A 1000 3 5 2 4 6 |
为什么替换在第一个实例处停止而不在第二个实例处继续?
如链接文章中所述,范围索引会产生副本。 可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | julia> A = [1 3 5; 2 4 6] 2x3 Array{Int64,2}: 1 3 5 2 4 6 julia> A1 = sub(A, :, 1) 2-element SubArray{Int64,1,Array{Int64,2},Tuple{Colon,Int64},2}: 1 2 julia> A2 = sub(A, :, 2) 2-element SubArray{Int64,1,Array{Int64,2},Tuple{Colon,Int64},2}: 3 4 julia> A1[A2 .== 3] = 1000 1000 julia> A 2x3 Array{Int64,2}: 1000 3 5 2 4 6 |
或使用
1 2 3 | julia> for i = 1:size(A,1) A[i,2] == 3 && (A[i,1]=1000) end |
编辑:看来您看到的奇怪行为已在某些时候得到解决。 这是我最新的git master的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | julia> versioninfo() Julia Version 0.4.0-dev+4743 Commit dc088f7 (2015-05-08 13:29 UTC) Platform Info: System: Linux (x86_64-redhat-linux) CPU: Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz WORD_SIZE: 64 BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Sandybridge) LAPACK: libopenblas LIBM: libopenlibm LLVM: libLLVM-3.3 julia> A = [1 3 5; 2 4 6] 2x3 Array{Int64,2}: 1 3 5 2 4 6 julia> A1 = sub(A, :, 1) 2-element SubArray{Int64,1,Array{Int64,2},Tuple{Colon,Int64},2}: 1 2 julia> A2 = sub(A, :, 2) 2-element SubArray{Int64,1,Array{Int64,2},Tuple{Colon,Int64},2}: 3 4 julia> A2 .> 2 2-element BitArray{1}: true true julia> A1[A2 .> 2] 2-element Array{Int64,1}: 1 2 julia> A1[A2 .> 2] = 1000 1000 julia> A1 2-element SubArray{Int64,1,Array{Int64,2},Tuple{Colon,Int64},2}: 1000 1000 julia> A 2x3 Array{Int64,2}: 1000 3 5 1000 4 6 |
通常,