How to use intersect command with a tolerance value?
이전 댓글 표시
I have two vector with different lenght and I want to compare the values of the vectors one by one with a certain tolerance because the numbers are similar but not equal, e.g. 222.456 and 222.389. I was using the command intersect but it only gives me the numbers that are exactly the same.
댓글 수: 1
madhan ravi
2019년 2월 12일
perhaps ismembertol() ?
답변 (1개)
While ismembertol might be useful, I'm still puzzled by the way it defines the tolerance.
If the vectors are not too large (some thousand elements should be fine), a simple loop approach should be sufficient:
function [AI, BI] = CommonElemTol(A, B, Tol)
A = A(:);
B = B(:);
nA = numel(A);
M = zeros(1, nA);
% Collect the index of the first occurrence in B for every A:
for iA = 1:nA
dist = abs(A(iA) - B); % EDITED: Of course abs() is needed
Ind = find(dist < Tol, 1); % Absolute tolerance
% Ind = find(dist ./ A(iA) < Tol, 1); % Relative tolerance
if ~isempty(Ind)
M(iA) = Ind;
end
end
AI = find(M); % If any occurrence was found, this A exists
if isempty(AI) % prevent: Empty matrix: 0-by-1
AI = [];
end
BI = M(AI); % at this index in B
end
댓글 수: 3
Vishal Dwivedi
2019년 2월 15일
Stephen23
2019년 2월 15일
I suspect that
dist = (A(iA) - B);
should be
dist = abs(A(iA) - B);
otherwise there is no absolute involved.
Jan
2019년 2월 15일
@Stephen: Of course. Thanks.
카테고리
도움말 센터 및 File Exchange에서 Operators and Elementary Operations에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!