【问题标题】:Matlab if loop not workingMatlab如果循环不起作用
【发布时间】:2011-12-14 16:26:51
【问题描述】:
%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 值它可以工作..!!但是如果我尝试使用一些函数并传递相同的值,它将无法工作。我尝试使用类检查类型,两者都返回双倍。

任何人都可以帮我解决这个问题,如果这种方法不好,请提出任何可以使用的替代方案。

【问题讨论】:

  • 也许值不一样。尝试打印(l - area)
  • 周围的值很小,不等于0

标签: matlab loops


【解决方案1】:

像您正在做的那样比较浮点数通常不是一个好主意(使用== 运算符),因为浮点数不像整数值需要四舍五入。有关在 MATLAB 中比较浮点数的讨论,请参阅 herehere

基本上你必须检查两个浮点数是否“足够接近”而不是完全相等,这是== 检查的内容。 MATLAB 有一个内置函数 eps 用于确定您机器上的浮点精度,因此在比较浮点数时使用该函数。请参阅其documentation 了解更多信息。

【讨论】:

  • eps 就像一个天花板函数。我不知道它到底是如何工作的。我尝试取面积和 l 的差值,然后应用 eps 函数,但如果给出了一些 e 功率值。
  • eps(x) 返回从x 到下一个最大浮点数的距离,即浮点数之间的步长。试试if abs(area-x) < eps(area)
【解决方案2】:

在大多数情况下,用a == b 比较浮点数是不明智的。使用abs(a-b)<epsilon,其中epsilon是一些小的公差,例如1e-10

【讨论】:

  • MATLAB 有一个内置函数eps,可以用来代替硬编码公差。
  • if (abs(area-x)
  • 试试abs(area-x) < eps(x)。这是否返回真实?如果面积的计算不精确到双精度,那么这将返回 false(如果它精确到单精度,则使用 eps('single') 而不是 eps(x))。如果您知道要比较两个浮点数的准确度,请使用@Boris 的答案并设置一个小的容差值,而不是使用eps
  • @Aps18 编辑我上面的评论:试试eps(single(x)),而不是eps('single')
  • abs(area-x)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多