【问题标题】:How to remove "infinite" while loop to improve MATLAB code?如何删除“无限”while 循环以改进 MATLAB 代码?
【发布时间】:2021-05-10 12:15:27
【问题描述】:

我正在实现一个对数量化器,我想做的是尽可能优化代码。我要进行更改的确切点是最后一个else 语句,其中要实现的等式是:

q(u) = u_i 如果u_i/(1+step) < u <= u_i/(1-step)
u_i = p^(1-i)u_o 对于i=1,2,...

参数p, step, u_o是一些要选择的常数。

有关量化器的更多信息,请参阅本文:Adaptive Backstepping Control of Uncertain Nonlinear Systems with Input Quantization

为了在 MATLAB 中编写一个函数来实现它,我编写了以下代码:

function q_u = logarithmic_hysteretic_quantizer(u,step,u_min)

    u_o = u_min*(1+step);
    p = (1-step)/(1+step);
    
    if u < 0           
        q_u = -logarithmic_hysteretic_quantizer(-u,step,u_min);            
    elseif ( (u >= 0) && (u <= u_o/(1+step)) )            
        q_u = 0;            
    else            
        i = 1;            
        while (1)                
            u_i = p^(1-i) * u_o;                
            if ( (u > u_i/(1+step)) && (u <= u_i/(1-step)) )                    
                q_u = u_i;
                break;                    
            end                
            i = i + 1;   
        end
    end 
end

现在,我的问题是尽可能地改进代码。例如,编码不同量化级别的while(1) 循环可能会消失并被替换。任何想法都将不胜感激。

【问题讨论】:

  • 好吧,如果您的条件 ( (u &gt; u_i/(1+step)) &amp;&amp; (u &lt;= u_i/(1-step)) ) 永远不会为真,那么您的问题是 i 会变为无穷大。我对对数量化了解不多,我无法访问您的链接。我建议你考虑一下i 应该走多远,从 1 到 100,1000,10000,... 然后你可以使用 for 循环而不是 while 循环。或者创建一个包含 1 到 100,1000,1000,... 的值的大型数组,然后使用它。
  • 给定ustep,您可以简单地计算ui 的最小和最大可接受值,并由此可以直接计算i 的最小和最大可接受值知道@ 987654337@。然后你取(我假设)该范围内的第一个整数(例如ceil(i_min))。

标签: matlab loops while-loop


【解决方案1】:

假设u_min&gt;00&lt;p&lt;1,您可以将(u &gt; u_i/(1+step)) &amp;&amp; (u &lt;= u_i/(1-step)) 简化为:

u/u_min > p^(1-i) && p^-i >= u/u_min

由于log 是单调的,因此简化为

-log(u/u_min)/log(p) > i-1 && i >= -log(u/u_min)/log(p)

这使得 while 循环等同于简单

i = floor(-log(u/u_min)/log(p));
q_u = p^(1-i) * u_o;

此外,elseif 分支中的(u &gt;= 0) 始终为真,您可以通过在正确的位置将u 替换为abs(u) 来摆脱u&lt;0 测试。

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2017-09-08
    • 2013-12-30
    • 2014-07-25
    相关资源
    最近更新 更多