2017-09-07 31 views
7

uniquetol फ़ंक्शन, आर2015 ए में पेश किया गया, "सहिष्णुता के भीतर अद्वितीय तत्व" की गणना करता है। विशेष रूप से,"यूनिकेटोल" क्या करता है, बिल्कुल?

C = uniquetol(A,tol) सहिष्णुता tol का उपयोग कर A में अद्वितीय तत्व देता है।

लेकिन किसी दिए गए सहिष्णुता के साथ अद्वितीय तत्व खोजने की समस्या कई समाधान है। वास्तव में कौन सा उत्पादित होता है?

के दो उदाहरण देखते हैं:

  1. पूर्ण सहिष्णुता 2.5 साथ A = [3 5 7 9] करते हैं। आउटपुट [3 7] हो सकता है, या यह [5 9] हो सकता है। दोनों समाधान आवश्यकता को पूरा करते हैं।

  2. पूर्ण सहिष्णुता 2.5 साथ A = [1 3 5 7 9] के लिए, उत्पादन [1 5 9] या [3 7] हो सकता है। तो आउटपुट में तत्वों के संख्या भी भिन्न हो सकते हैं।

संक्रामिता मुद्दा यह है कि समस्या के दिल में निहित है के बारे में this nice discussion देखें।

तो, uniquetol कैसे काम करता है? कई मौजूदा समाधानों में यह किस उत्पादन का उत्पादन करता है?

+0

क्यों 'रिवर्स engineering' टैग? – arrowd

+0

@arrowd क्योंकि वह फ्यूशन –

+0

@arrowd ईमानदार होने के लिए उलटा हुआ है, मुझे पूरा यकीन नहीं है कि यह यहां लागू होता है। मुझे लगता है कि यह करता है, जैसा कि वर्णन कहता है _Reverse इंजीनियरिंग मानव के तकनीकी सिद्धांतों की खोज करने की प्रक्रिया है [...] ऑब्जेक्ट या सिस्टम [...] फ़ंक्शन और ऑपरेशन._ –

उत्तर

7

करने के लिए को आसान बनाने में, मैं विचार एक उत्पादन, दो इनपुट uniquetol की संस्करण,

C = uniquetol(A, tol); 

जहां पहले इनपुट एक doubleवेक्टरA है। विशेष रूप से, यह संकेत मिलता है कि:

  • uniquetol की 'ByRows' विकल्प नहीं किया जाता है।
  • पहला इनपुट एक वेक्टर है। यदि यह नहीं था, uniquetol सामान्य रूप से कॉलम पर निहित रूप से रैखिक होगा।
  • दूसरे इनपुट, जो सहिष्णुता को परिभाषित करता है, as follows व्याख्या की है:

    दो मूल्यों, u और v, सहिष्णुता के भीतर हैं, तो abs(u-v) <= tol*max(abs(A(:)))

    है, निर्दिष्ट सहिष्णुता रिश्तेदार है डिफ़ॉल्ट रूप से। तुलना में उपयोग की जाने वाली वास्तविक सहिष्णुता स्केलिंग A में अधिकतम पूर्ण मूल्य से प्राप्त की जाती है।

इन विचारों के साथ, ऐसा लगता है कि दृष्टिकोण कि uniquetol का उपयोग करता है:

  1. क्रमबद्ध A
  2. क्रमबद्ध A की पहली प्रविष्टि चुनें, और इसे संदर्भ मान के रूप में सेट करें (यह मान बाद में अपडेट किया जाना होगा)।
  3. आउटपुट C में संदर्भ मान लिखें।
  4. क्रमबद्ध A की अनुवर्ती प्रविष्टियों को छोड़ दें जब तक कोई ऐसा नहीं पाया जाता है जो संदर्भ मान की सहिष्णुता के भीतर नहीं है। जब कि प्रवेश पाया जाता है, नया संदर्भ मूल्य के रूप में यह लेने के लिए और 3.
बेशक

कदम के लिए वापस जाओ, मैं यह नहीं कह रहा हूँ कि यह क्या uniquetolआंतरिक करता है। लेकिन आउटपुट समान प्रतीत होता है। तो यह कार्यात्मक रूप सेuniquetol के बराबर है। (अक्षम कोड, बिंदु सिर्फ वर्णन करने के लिए)

कोड निम्नलिखित शायद स्पष्ट है

% Inputs A, tol 
% Output C 
tol_scaled = tol*max(abs(A(:))); % scale tolerance 
C = []; % initiallize output. Will be extended 
ref = NaN; % initiallize reference value to NaN. This will immediately cause 
      % A(1) to become the new reference 
for a = sort(A(:)).'; 
    if ~(a-ref <= tol_scaled) 
     ref = a; 
     C(end+1) = ref; 
    end 
end 

करने के लिए इस की पुष्टि, चलो कुछ यादृच्छिक डेटा उत्पन्न करते हैं और uniquetol के उत्पादन की तुलना और इसके बाद के संस्करण की कोड:

clear 
N = 1e3; % number of realizations 
S = 1e5; % maximum input size 
for n = 1:N; 
    % Generate inputs: 
    s = randi(S); % input size 
    A = (2*rand(1,S)-1)/rand; % random input of length S; positive and 
           % negative values; random scaling 
    tol = .1*rand; % random tolerance (relative). Change value .1 as desired 

    % Compute output: 
    tol_scaled = tol*max(abs(A(:))); % scale tolerance 
    C = []; % initiallize output. Will be extended 
    ref = NaN; % initiallize reference value to NaN. This will immediately cause 
       % A(1) to become the new reference 
    for a = sort(A(:)).'; 
     if ~(a-ref <= tol_scaled) 
      ref = a; 
      C(end+1) = ref; 
     end 
    end 

    % Check if output is equal to that of uniquetol: 
    assert(isequal(C, uniquetol(A, tol))) 
end 

मेरे सभी परीक्षणों में यह असफलता के बिना चला गया है।

तो, सारांश में, uniquetol इनपुट सॉर्ट करने के लिए, अपनी पहली प्रविष्टि लेने लगता है, और रखें जब तक कि यह कर सकते हैं के लिए लंघन प्रविष्टियों।

प्रश्न में दो उदाहरणों के लिए, आउटपुट निम्नानुसार हैं। ध्यान दें कि दूसरे इनपुट 2.5/9 के रूप में निर्दिष्ट किया जाता है, जहां 9 पहला इनपुट की अधिकतम है, 2.5 की एक निरपेक्ष सहिष्णुता प्राप्त करने के लिए:

>> uniquetol([1 3 5 7 9], 2.5/9) 
ans = 
    1  5  9 
>> uniquetol([3 5 7 9], 2.5/9) 
ans = 
    3  7 
+1

के विश्लेषण के माध्यम से, इसलिए, प्रश्न में उदाहरण, आउटपुट कौन सा है? (+1) –

+1

@AnderBiguri अच्छा बिंदु, मैं इसे शामिल करूंगा। यह मूल रूप से इसे प्राप्त होने वाले पहले मान को चुनता है, फिर मूल्यों को छोड़ देता है जब तक कि यह और नहीं छोड़ सकता है। तो: 'यूनिकेटोल ([3 5 7 9], 2.5/9) '' 3 [7] देता है; 'यूनिकेटोल ([1 3 5 7 9], 2.5/9)' '1 5 9]' देता है। ध्यान दें '/ 9' तो '2.5' _absolute_ सहिष्णुता है –

संबंधित मुद्दे