朱莉娅的条件分配

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

为什么替换在第一个实例处停止而不在第二个实例处继续?


如链接文章中所述,范围索引会产生副本。 可以使用SubArray规避

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

或使用for循环

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

通常,for循环版本将比通过这种方式处理更快