有没有更有效的方法来替换这些多个IF语句?

时间:2019-09-04 02:20:23

标签: c++ if-statement

我正在尝试使程序的这一部分更有效地运行,并且我不确定最好的方法是优化此代码块以使其更快

系统的输入范围是1到-1(很敏感,我需要详细信息)。我正在尝试计算称为yaw_cmd_v(偏航命令电压)的输出

//Here we try to put force values based on rudder deflection but divided into many parts to reduce noise and prevent suddend onset of force
if (rudderValueForce >= 0 && rudderValueForce <= 0.05)      { yaw_CMND_V = -rudderValueForce * 0; }
if (rudderValueForce >= 0.05 && rudderValueForce <= 0.1)    { yaw_CMND_V = -rudderValueForce * 5; }
if (rudderValueForce >= 0.1 && rudderValueForce <= 0.15)    { yaw_CMND_V = -rudderValueForce * 10; }
if (rudderValueForce >= 0.15 && rudderValueForce <= 0.2)    { yaw_CMND_V = -rudderValueForce * 15; }
if (rudderValueForce >= 0.2 && rudderValueForce <= 0.25)    { yaw_CMND_V = -rudderValueForce * 20; }
if (rudderValueForce >= 0.25 && rudderValueForce <= 0.3)    { yaw_CMND_V = -rudderValueForce * 25; }
if (rudderValueForce > 0.3 && rudderValueForce <= 0.5)      { yaw_CMND_V = -rudderValueForce * 50; }
if (rudderValueForce > 0.5 && rudderValueForce <= 0.7)      { yaw_CMND_V = -rudderValueForce * 60; }
if (rudderValueForce > 0.7 && rudderValueForce <= 1)        { yaw_CMND_V = -rudderValueForce * 70; }

//Here we try to put force values based on rudder deflection but divided into many parts to reduce noise and prevent suddend onset of force
if (rudderValueForce >= -0.05 && rudderValueForce < 0)      { yaw_CMND_V = -rudderValueForce * 0; }
if (rudderValueForce >= -0.1 && rudderValueForce < -0.05)   { yaw_CMND_V = -rudderValueForce * 5; }
if (rudderValueForce >= -0.15 && rudderValueForce < -0.1)   { yaw_CMND_V = -rudderValueForce * 10; }
if (rudderValueForce >= -0.20 && rudderValueForce <- 0.15)  { yaw_CMND_V = -rudderValueForce * 15; }
if (rudderValueForce >= -0.25 && rudderValueForce <- 0.20)  { yaw_CMND_V = -rudderValueForce * 20; }
if (rudderValueForce >= -0.3 && rudderValueForce <- 0.25)   { yaw_CMND_V = -rudderValueForce * 25; }
if (rudderValueForce >= -0.5 && rudderValueForce <- 0.3)    { yaw_CMND_V = -rudderValueForce * 50; }
if (rudderValueForce >= -0.7 && rudderValueForce <- 0.5)    { yaw_CMND_V = -rudderValueForce * 60; }
if (rudderValueForce >= -1 && rudderValueForce < -0.7)      { yaw_CMND_V = -rudderValueForce * 70; }

3 个答案:

答案 0 :(得分:1)

您可以将所有数据放入数据结构中,以免数据散布在代码中,并且无论您拥有多少数据点,都可以在循环中使用单个 ImageSpan is = new ImageSpan(this,R.mipmap.ic_launcher); String tx = "dfsfsfsfsfsdfsdfs"; SpannableString ss = new SpannableString(tx); ss.setSpan(is,0,1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); ss.setSpan(CharacterStyle.wrap(is),6,7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); tv.setText(ss);

if

答案 1 :(得分:0)

您也许可以删除AND,这意味着除第一项检查外,每项检查都不必属于两项。但是以下内容表示即使先前已找到匹配项,每个if语句也会被求值。

int setYaw_CMND_V (float rudderValueForce) {
    if (rudderValueForce >= 0 && rudderValueForce <= 0.05)      { 
        return -rudderValueForce * 0; 
    }
    if (rudderValueForce <= 0.1)    { 
        return -rudderValueForce * 5; 
    }
    if (rudderValueForce <= 0.15)    { 
        return -rudderValueForce * 10; 
    }
    // ... 
}

最好创建一个一旦if语句设置yaw_CMND_V就返回的函数或方法。然后,不必评估所有的if语句,就像这样:

<?php
// src/AppBundle/Controller/LuckyController.php
namespace AppBundle\Controller;

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class LuckyController extends Controller
{
    /**
     * @Route("/lucky/number", name="luckyNumber")
     */
    public function numberAction()
    {
        $number = random_int(0, 100);

        return $this->render('lucky/number.html.twig', [
            'number' => $number,
        ]);
    }
}

答案 2 :(得分:0)

您具有平衡的范围,因此您无需检查2个不同的条件,只需取绝对值并使用它即可。正如其他人所说,您需要两次检查某些边界(例如rudderValueForce <= 0.05rudderValueForce >= 0.05),这是不必要的,有时会导致错误的值。只需一次检查一个边界,就可以按升序或降序

auto v = std::abs(rudderValueForce);
if (v > 1)
    return; // invalid value, do nothing
else if (v > 0.7)
    yaw_CMND_V = -rudderValueForce * 70;
else if (v > 0.5)
    yaw_CMND_V = -rudderValueForce * 60;
else if (v > 0.3)
    yaw_CMND_V = -rudderValueForce * 50;
else
    yaw_CMND_V = -rudderValueForce * (std::ceil(v/0.05) - 1);

0.3以下的范围具有相同的宽度(0.05),因此可以像上面那样简化,而无需使用单独的if块。需要使用ceil是因为您的范围看起来像(0.25,0.3]。如果范围是最期望的[0.25,0.3],它将更加简单:yaw_CMND_V = -rudderValueForce * int(rudderValueForce/0.05)。同样,范围(0.3,0.5]和(0.5,0.7]也可以合并为一个公式

-rudderValueForce*(std::ceil((v - 0.3)/0.2)*10 + 40)

但是,根据平台的不同,进行划分可能会非常昂贵,因此对于v> 0.25,v> 0.2,v> 0.15 ...,您可能希望将其拆分为单独的案例。

也就是说,如注释中所述,要优化代码,需要更多上下文