朱莉娅:找到矩阵中的行

Ada*_*dam 7 matrix julia

使用Julia,我想确定行是否位于矩阵中并且(如果适用)行所在的矩阵中的位置.例如,在Matlab中,这可以通过以下方式完成ismember:

a = [1 2 3];
B = [3 1 2; 2 1 3; 1 2 3; 2 3 1]
B =

 3     1     2
 2     1     3
 1     2     3
 2     3     1

ismember(B, a, 'rows')
ans =

 0
 0
 1
 0
Run Code Online (Sandbox Code Playgroud)

由此,我们可以看到a位于第3行B.在朱莉娅有没有类似的功能来实现这一目标?

mma*_*ski 7

您也可以通过简单地测试equality(.==)而不使用理解来利用数组广播:

all(B .== a, 2)
Run Code Online (Sandbox Code Playgroud)

哪个给你:

4x1 BitArray{2}:
 false
 false
  true
 false
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用此数组上的find来获取行的索引:

find(all(B .== a, 2))
Run Code Online (Sandbox Code Playgroud)

你得到:

1-element Array{Int64,1}:
 3
Run Code Online (Sandbox Code Playgroud)


ntd*_*def 5

尽管Julia没有内置功能,但作为单行代码它足够简单。

a = [1 2 3];
B = [3 1 2; 2 1 3; 1 2 3; 2 3 1]
ismember(mat, x, dims) = mapslices(elem -> elem == vec(x), mat, dims)
ismember(B, a, 2)  # Returns booleans instead of ints
Run Code Online (Sandbox Code Playgroud)


roy*_*vib 5

另一种模式是使用数组理解:

julia> Bool[ a == B[i,:] for i=1:size(B,1) ]
4-element Array{Bool,1}:
false
false
true
false

julia> Int[ a == B[i,:] for i=1:size(B,1) ]
4-element Array{Int64,1}:
0
0
1
0
Run Code Online (Sandbox Code Playgroud)


Dan*_*etz 5

怎么样:

matchrow(a,B) = findfirst(i->all(j->a[j] == B[i,j],1:size(B,2)),1:size(B,1))
Run Code Online (Sandbox Code Playgroud)

0如果没有匹配的行,则返回;如果没有匹配的行,则返回第一行。

matchrow(a,B)
Run Code Online (Sandbox Code Playgroud)

3

应该是“尽可能快”并且非常简单。

  • 这在 Julia 1.1.0 中有效,而其他答案则不然。 (2认同)
  • 如果您使用的是 Julia >1.0,则当没有匹配行时,此函数将返回“nothing”。 (2认同)