使用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
据此,我们可以看到a
位于B
的第3行。在朱莉娅有没有类似的功能来实现这一目标?
答案 0 :(得分:6)
您也可以通过简单地测试相等性(.==
)而不使用理解来利用数组广播:
all(B .== a, 2)
这给了你:
4x1 BitArray{2}:
false
false
true
false
然后,您可以使用此数组上的find来获取行的索引:
find(all(B .== a, 2))
你得到:
1-element Array{Int64,1}:
3
答案 1 :(得分:4)
尽管朱莉娅没有内置功能,但它很容易作为单线程。
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
答案 2 :(得分:4)
另一种模式是使用数组理解:
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
答案 3 :(得分:3)
怎么样:
matchrow(a,B) = findfirst(i->all(j->a[j] == B[i,j],1:size(B,2)),1:size(B,1))
在没有匹配的行时返回0
,或者在没有匹配的行时返回第一个行号。
matchrow(a,B)
3
应该尽可能快""而且非常简单。