爲了簡化,我考慮一輸出,雙輸入版本的uniquetol
,
C = uniquetol(A, tol);
其中第一輸入是double
矢量A
。特別是,這意味着:
考慮到這些因素,似乎是uniquetol
使用方法是:
- 排序
A
。
- 挑選排序的
A
的第一個條目,並將其設置爲參考值(此值將稍後更新)。
- 將參考值寫入輸出
C
。
- 跳過排序的
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
爲什麼'反向engineering'標籤? – arrowd
@arrowd,因爲他反向工程的作用 –
@arrowd說實話,我並不完全確定它適用於此。我認爲它的確如描述所說_逆向工程是通過分析其功能和操作來發現人造物體或系統的技術原理的過程._ –