2015-09-01 3 views
5

मैच() के आर के सहायता पृष्ठ से:आर के मैच के जूलिया संस्करण?

विवरण:

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

है कि, मैं दो वैक्टर, मैच (v1, v2) देता है एक वेक्टर जहां i'th तत्व है दे सकते हैं सूचकांक जहां v1 [i] v2 में प्रकट होता है।

क्या जूलिया के लिए ऐसा कोई ही काम है? मुझे यह नहीं मिला।

+1

http: // stackoverflow .com/प्रश्न/20102250/find-first-index-of-an-item-in-an-array-in-julia – Khashaa

उत्तर

6

ऐसा लगता है आप indexin लिए देख रहे हैं की तरह (बस खोज चारा के रूप में, यह भी ismember मैटलैब द्वारा कहा जाता है)। यह बहुत अलग है: यह एक वेक्टर लौटाता है जहां i'th तत्व अंतिम अनुक्रमणिका है जहां 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 

यह v1 में एक तत्व के सूचकांक कि v2 में प्रकट नहीं होता के लिए शून्य देता है। तो अगर आप "फिर से संगठित" कर सकते हैं v1 के कुछ हिस्सों कि अशून्य सूचकांक द्वारा बस अनुक्रमण द्वारा v2 में हैं:

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

आप the implementation को देखें, तो आपको लगता है कि यह एक शब्दकोश का उपयोग करता है की दुकान और देखने के लिए दिखाई देगा सूचकांक। इसका मतलब यह है कि v1 में प्रत्येक तत्व के लिए v2 के माध्यम से खोज करने के विरोध में यह केवल v1 और v2 से अधिक पास करता है। यह लगभग सभी मामलों में अधिक कुशल होना चाहिए।

यदि यह आर के व्यवहार से मेल खाते हैं और पहली सूचकांक वापस जाने के लिए महत्वपूर्ण है, हम आधार कार्यान्वयन बंद पालना कर सकते हैं और सिर्फ शब्दकोश का निर्माण पीछे की ओर इतना कम सूचकांक उच्च अधिलेखित हो:

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

उत्कृष्ट उत्तर, धन्यवाद :) – Lindon

4

मुझे नहीं लगता कि यह बॉक्स से बाहर है, लेकिन @ खशा की टिप्पणी (और टिम होली का अन्य प्रश्न का उत्तर) बताता है, आपको अपनी परिभाषा के साथ काफी जल्दी आना चाहिए। एक पहला प्रयास:

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 

(ध्यान दें कि मैं क्योंकि match स्ट्रिंग मिलान के लिए बेस में परिभाषित किया गया है समारोह matched कहा जाता है, अगर आप इसे विस्तार करने के लिए करना चाहता था आप Base.match पहले आयात करने के लिए होगा)। यदि आप प्रदर्शन की परवाह करते हैं तो आप निश्चित रूप से जूलिया डॉक्स के प्रदर्शन अनुभाग से कुछ चालें लागू कर सकते हैं।
यह फ़ंक्शन ऐसा करना चाहिए जो आप खोज रहे हैं यदि मैं सही ढंग से समझता हूं, तो इसे उदाहरण के साथ आज़माएं

v1 = [rand(1:10) for i = 1:100] 
v2 = [rand(1:10) for i = 1:100] 
matched2(v1,v2) 
संबंधित मुद्दे