2015-09-01 9 views
5

:R'in Maçı'nın Julia versiyonu? maçın() ait R'ın yardım sayfalarından

Açıklama: i'inci unsurdur nerede

‘match’ returns a vector of the positions of (first) matches of 
its first argument in its second. 

, ben maçı (V1, V2) döndürür, bir vektör iki vektörleri verebilir v1 [i] v2’de belirir.

Julia için benzer bir işlev var mı? Onu bulamıyorum.

+1

http: // stackoverflow .com/questions/20102250/find-first-in-an-item-in-an-dizide-in-julia – Khashaa

cevap

6

(sadece arama yemi olarak, bu aynı zamanda Matlab tarafından ismember denir). Çok az farklıdır: i 'elemanının son dizini olduğudizininin v2 içinde göründüğü bir vektör döndürür.

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

O v2 görünmüyor v1 bir elemanın indeksi sıfır döndürür. Yani sıfırdan farklı indeksler tarafından basitçe endeksleme tarafından v2 içindedir v1 bazı bölgelerinde "yeniden" yapabilirsiniz: the implementation bakarsanız, bunu saklamak ve aramak için bir sözlük kullandığını göreceksiniz

julia> v2[idxs[idxs .> 0]] 
3-element Array{Int64,1}: 
8 
6 
7 

endeksleri. Bu, v1'daki her öğe için v2 üzerinden arama yapmanın aksine, yalnızca bir geçişi v1 ve v2 her biri üzerinden yaptığınız anlamına gelir. Hemen hemen her durumda çok daha verimli olmalı.

o R'ın davranışını eşleşecek ve ilk endeks dönmek önemliyse, biz baz uygulanmasını kapalı beşik ve sadece alt endeksler yüksek olanları üzerine geriye böylece sözlüğü oluşturabilirsiniz:

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 
+0

Mükemmel cevap, teşekkür ederim :) – Lindon

4

Bunun kutudan çıktığını sanmıyorum, ama @ Khashaa'nın yorumu (ve Tim Holy'un diğer soruya verdiği yanıt) da işaret ettiği gibi, kendi tanımınızla oldukça hızlı bir şekilde gelebilmeniz gerekir. Bir ilk girişim:

function matched(v1::Array, v2::Array) 
    matched = zeros(length(v1)) 
    for i = 1:length(v1) 
    matched[i] = findfirst(v2, v1[i]) 
    end 
    return matched 
end 

(bunu uzatmak istiyorsa match dize eşleşmesi için Base tanımlanmış olması nedeniyle ben fonksiyonunu matched denilen unutmayın, sen Base.match ilk ithal etmesi gerekir). Performansı önemsiyorsanız, bu durumu Julia doktorlarının performans bölümlerinden bazılarına uygulayarak daha hızlı yapabilirsiniz.
Bu işlev, doğru bir şekilde anladığım takdirde aradığınız şeyi yapıyor olmalıdır, örneğin, ör. Eğer indexin aradığınız gibi geliyor

v1 = [rand(1:10) for i = 1:100] 
v2 = [rand(1:10) for i = 1:100] 
matched2(v1,v2)