朱莉娅版的R's Match?

Lin*_*don 6 r julia

来自R的match()帮助页面:

描述:

__PRE__

也就是说,我可以给出两个向量,match(v1,v2)返回一个向量,其中第i个元素是v1 [i]出现在v2中的索引.

朱莉娅有这么类似的功能吗?我找不到它了.

Mat*_* B. 7

这听起来像你正在寻找indexin(就像搜索饲料,这也是ismember由Matlab 调用).它略有不同:它返回一个向量,其中第i个元素是出现的最后一个索引.v1[i]v2

julia> v1 = [8,6,7,11]; v2 = -10:10;
       idxs = indexin(v1, v2)
4-element Array{Int64,1}:
 19
 17
 18
  0
Run Code Online (Sandbox Code Playgroud)

对于v1未出现的元素的索引,它返回零v2.所以,你可以在"重建"的部分v1是在v2简单地通过非零指数索引:

julia> v2[idxs[idxs .> 0]]
3-element Array{Int64,1}:
 8
 6
 7
Run Code Online (Sandbox Code Playgroud)

如果你看一下实现,你会发现它使用字典来存储和查找索引.这意味着,它才有一个越过v1v2每个,而不是通过搜索v2用于每个元素v1.它几乎在所有情况下都应该更有效率.

如果匹配R的行为并返回第一个索引很重要,我们就可以完成基本实现,只需向后构建字典,以便较低的索引覆盖较高的索引:

function firstindexin(a::AbstractArray, b::AbstractArray)
    bdict = Dict{eltype(b), Int}()
    for i=length(b):-1:1
        bdict[b[i]] = i
    end
    [get(bdict, i, 0) for i in a]
end

julia> firstindexin([1,2,3,4], [1,1,2,2,3,3])
4-element Array{Int64,1}:
 1
 3
 5
 0

julia> indexin([1,2,3,4], [1,1,2,2,3,3])
4-element Array{Int64,1}:
 2
 4
 6
 0
Run Code Online (Sandbox Code Playgroud)