2011-12-14 9 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と私が得る領域が同じであると仮定します。私はいくつかの関数を使用しようとすると、それは動作しません同じ値を渡す場合。私はクラスを使用して型をチェックしようとしましたが、どちらもdoubleを返します。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

それはあなたがフロートするので(==演算子で)やっているように山車を比較するために、一般的に良いアイデアではない、とは異なり、整数値は四捨五入される場合があります。 MATLABで浮動小数点数を比較する方法については、hereおよびhereを参照してください。

基本的に、あなたは何==チェックのためである、2つのfloatは「十分に近い」というよりも、正確に等しいことを確認する必要があります。 MATLABには、マシン上の浮動小数点精度を決定するための組み込み関数epsがあります。したがって、浮動小数点数を比較するときにその関数を使用してください。詳細はdocumentationを参照してください。

+0

epsは天井関数のようですか?私は理解できませんでした。 私は領域とlの両方の違いを取って、eps関数を適用しようとしましたが、いくつかのeの電力値を与えます。 – Aps18

+0

['eps(x)'](http://www.mathworks.co.uk/help/techdoc/ref/eps.html)は 'x'から次に大きい浮動小数点数までの距離を返します。つまり、浮動小数点数の間の刻み幅。 'abs(area-x) Chris