使用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
.在朱莉娅有没有类似的功能来实现这一目标?
您也可以通过简单地测试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)
尽管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)
另一种模式是使用数组理解:
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)
怎么样:
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
应该是“尽可能快”并且非常简单。