2011-12-14 3 views
0
%function [flag] =verify(area) 

[FileName,PathName,FilterIndex]= uigetfile('*.tif','Select the signature file'); 
display(PathName) 
m=[PathName,FileName]; 
area=nor_area(m); 
%display(area) 

%area=0.8707; 
class(area) 

flag=0; 
extract=xlsread('D:\Project\Image_processing\important\best.xlsx', 'CW4:CW17'); 
c=numel(extract); 
display(c) 
l=extract(1); 
class(l) 
display(l) 
for k = 1:c 
%x=extract(k); 
if (l==area && flag==0) 
    % display(extract(k)); 
     flag=1; 
     display(flag) 
end 
end 
display(flag) 

Приведенный выше мой код для проверки, я не могу сравнить «l == area», даже если значения одинаковы, я не могу войти в цикл. Если я попробую передать значение, предположим, что l = 0.9999, и область, которую я получу, будет одинаковой, если я отправил значение l явно, это работает. !! но если я попытаюсь использовать какую-то функцию и передаю то же значение, она не будет работать. Я попытался проверить тип с помощью класса, оба возвращаются дважды.Matlab if loop not working

Может кто-нибудь, пожалуйста, помогите мне с этим, и если этот подход не подходит, предложите любую альтернативу, которая может быть использована.

+0

Возможно, значения не совпадают. Попробуйте выполнить печать '(l - area)'. –

+0

Значение этого значения очень мало и не равно 0 – Aps18

ответ

2

В большинстве случаев нецелесообразно сравнивать числа с плавающей запятой на a == b. Используйте abs(a-b)<epsilon, где epsilon - это небольшой допуск, такой как 1e-10.

+1

MATLAB имеет встроенную функцию ['eps'] (http://www.mathworks.co.uk/help/techdoc/ref/eps.html), который можно использовать вместо жесткого кодирования допуска. – Chris

+0

if (abs (area-x) Aps18

+0

Попробуйте 'abs (area-x) Chris

3

Не рекомендуется сравнивать поплавки, как вы делаете (с оператором ==), поскольку поплавки, в отличие от целых значений, подлежат округлению. См. here и here для обсуждения сравнения поплавков в MATLAB.

По существу, вы должны проверить, что два поплавка «достаточно близко», а не ровно равны, что и проверяет ==. MATLAB имеет встроенную функцию eps для определения точности с плавающей точкой на вашем компьютере, поэтому используйте эту функцию при сравнении поплавков. См. Его documentation для получения дополнительной информации.

+0

Является ли eps как функция потолка. Я не мог понять, как именно он работает. Я попытался воспользоваться разницей как в области, так и l, а затем применить функцию eps, но если дает некоторые значения мощности e. – Aps18

+0

['eps (x)'] (http://www.mathworks.co.uk/help/techdoc/ref/eps.html) возвращает расстояние от 'x' до следующего по величине числа с плавающей запятой, т.е. размер шага между поплавками. Попробуйте 'if abs (area-x) Chris