【问题标题】:&& operators issue in MATLABMATLAB 中的 && 运算符问题
【发布时间】:2015-07-04 17:52:40
【问题描述】:

这是我的代码:

friendly_output = num2str(std(counts_channel),'%.4f');
if friendly_output > 0 && friendly_output <= 1000
    variable = 100
elseif friendly_output > 1000 && friendly_output <= 1500
    variable = 500

这里的变量friendly_output 是一个十进制数。但是,当我执行此代码时,这会提示我错误:

|| 的操作数和 && 运算符必须可转换为逻辑 标量值

我尝试通过将&amp;&amp; 替换为&amp; 来解决此问题,程序可以运行,但变量friendly_output 未能捕获正确的if 语句。

我尝试输出friendly_output的值,该值是正确的,但它进入的语句是错误的。

谢谢。

【问题讨论】:

  • 不清楚你为什么首先使用num2str。如果你打印出你的friendly_output 变量和size(friendly_output),你会发现它不是一个标量。现在在命令行窗口中尝试help &amp;help &amp;&amp;。另请参阅this answer
  • 移除 num2str 或在友好输出上使用 str2num。如果要比较字符串,请使用 strcmp。

标签: matlab


【解决方案1】:

如果我的猜测是正确的,你的friendly_outputchar 类型

要检查,试试这个:

class(friendly_output)

如果需要与整数进行比较,则需要将其转换回数字。

为此,请在第一行之后添加此代码

friendly_output = str2double(friendly_output);
%// changed from `eval` to `str2double` as suggested by @horchler
%// Using `str2double` over `eval` or `str2num` is a best practice.
%// or you could just avoid `num2str` conversion

PS:

&amp;&amp; 运算符不适用于您,因为它们仅适用于标量输入。但是由于friendly_output 变量是char 数组,所以你得到了错误。

虽然&amp; 处理数组输入,但每个字符首先转换为其对应的 ASCII 值,然后与数字进行比较。因此,即使 Matlab 没有发布错误,结果也不会对您有利。

更多关于&amp;&amp;&amp;区别的信息Refer Here

以下是不将字符串转换回数字时发生的情况的示例:

>> a = '1200.5'

a =

1200.5

>> a > 1000

ans =

 0     0     0     0     0     0

char 0-9 的 ASCII 值范围为 49-57 而 char '.' 的 ASCII 值是 46

虽然1200.5大于1000,但实际上是这样计算的

50(char '1') 不大于 1000。
51(char '2') 不大于 1000。
49(char '0') 不大于 1000。
49(char '0') 不大于 1000。
46(char '.') 不大于 1000。
54(char '5') 不大于 1000。

【讨论】:

  • Matlab 中没有“字符串”类。 friendly_output 是一个 char 数组。而eval 是将表示浮点值的字符串转换回双精度的错误(不安全和不好的做法)方法。 str2doublestr2num 应该用于此。您没有解释错误的原因以及为什么 &amp;&amp; 不适用于非标量 char 数组。不过,我也不知道 OP 首先要使用num2str 完成什么。
  • @horchler,感谢您指出错误,而不是仅仅投反对票。我已经编辑了答案。如果您仍然认为我缺乏一些信息,请随时做出自己的答案,我会投赞成票。您还可以解释为什么使用eval 是一种不好的做法吗?
  • 不使用eval 的主要原因是因为在大多数情况下有更好、更快、更健壮的方法来做同样的事情(这是一种)。 eval 在不检查任何内容的情况下评估任意字符串,这显然会导致多种问题或漏洞。更多信息:123
  • ...此外,这个网站上有很多人会因为滥用eval 而立即对您投反对票,除了rare cases where it is necessary or useful 之一。这种情况通常只发生在编写非常低级的函数或库时。例如,Matlab 的符号数学工具箱实际上是基于在其基础上使用 eval 的形式。
  • 最后,如果可能,应避免将单个 char 值与逻辑运算符进行比较 - see here。您应该使用strcmp 或其亲属之一。
猜你喜欢
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2021-10-01
  • 2013-03-07
  • 1970-01-01
相关资源
最近更新 更多