【问题标题】:Matlab composite 'if' statement not giving expected result [closed]Matlab复合'if'语句未给出预期结果[关闭]
【发布时间】:2013-05-29 19:34:00
【问题描述】:

在为本文http://adsabs.harvard.edu/abs/1992PASJ...44..493K编写方程(5)的程序时,

我想我犯了一些错误(下)。我不知道如何在等式中包含“或”。

    if alpha_sgp<alpha<=(alpha_sgp-180)
        if p<=180-t
          P=p+t;
        else %p>180-t
          P=p+t-180;
        end
    elseif alpha<=alpha_sgp | (alpha_sgp-180)<alpha   
        if p>=t
          P=p-t;
        else %p<t
          P=p-t+180;
        end
    end

任何帮助将不胜感激。

【问题讨论】:

  • 在这篇论文的链接中:articles.adsabs.harvard.edu/cgi-bin/…您要实现的算法在哪里?
  • 首先,您应该阅读this reference on for loops。其次,如果你想让任何人解释应该如何在 Matlab 中完成,你应该用伪代码发布你想做的事情。一般来说,在 Matlab 中,for 循环是“最后的手段”,出于性能原因,几乎所有操作都应该以向量化形式完成,而不是循环。但目前尚不清楚这是否可能在您的问题中。
  • 其次:到底是什么问题?
  • 只是一个疯狂的猜测:在您引用的论文中,我假设您指的是等式(5)。但是,他们使用pi 而非180 来实现其逻辑。根据您的其余代码,这可能是一个问题。
  • 是的@Schorsch,@Reinderien,我指的是eq。 (5)。另外,这里的 pi 是弧度的,这就是我使用 180 的原因。我正在尝试实现 eq。 (5) 这样我就可以得到P的值。这里,alpha, p & t是Nx1个向量& alpha_sgp是一个单一的数字。

标签: matlab for-loop


【解决方案1】:

我觉得你的说法有问题:

if alpha_sgp<alpha<=(alpha_sgp-180)

虽然这在 Matlab 中的语法是正确的,但它并没有按照你的想法做。

简单示例:

a=1;b=2;c=3;
disp(a<b<c)

将返回 1 (true)。但是

disp(a<c<b)

也将返回1。这与操作顺序有关,并且在将结果与c 进行比较之前,将评估a&lt;b 类型的子表达式(到1)。因此

a<b<c

相当于

(a<b) < c

相当于

If ( (a < b) & (1 < c)) | ( (a >= b ) & (0 < c) )

你真正想要的第一行是

(alpha_sgp<alpha) & (alpha<=(alpha_sgp-180))

除了确保正确地将度数转换为弧度等。我建议您坚持使用弧度 - 使用内置的 pi - 而不是以度数工作,并且必须使用像 @ 这样的函数987654334@ 而不是 sin

另外 - 你对“不知道如何包含for”提出了一个奇怪的评论 - 当没有for 时,等式中只有一个or。这可能是您的错字吗?

最后 - 请注意,第二组条件基本上与第一组相反 - 当(alpha_sgp &lt; alpha) &amp; (alpha &lt;= (alpha_sgp-180)) 为假时,反之亦然。所以在实现你的公式时,你可以用 else 替换整个 elseif 行。

如果您需要进一步说明,请随时发表评论。

【讨论】:

  • +1 对逻辑运算的很好解释。
  • @Schorsch - 感谢第一个,第二个很好。缺少一个空格,因此代码行(就在“您真正想要的第一行是”之后)显示为文本,第一个 &lt; 符号将 HTML 解释器抛出一个循环...添加了一个空格,现在我觉得还可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
相关资源
最近更新 更多