朱莉娅:找到矩阵中的行

时间:2015-09-22 01:41:51

标签: 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

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

4 个答案:

答案 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

应该尽可能快""而且非常简单。