【发布时间】: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 > u_i/(1+step)) && (u <= u_i/(1-step)) )永远不会为真,那么您的问题是i会变为无穷大。我对对数量化了解不多,我无法访问您的链接。我建议你考虑一下i应该走多远,从 1 到 100,1000,10000,... 然后你可以使用 for 循环而不是 while 循环。或者创建一个包含 1 到 100,1000,1000,... 的值的大型数组,然后使用它。 -
给定
u和step,您可以简单地计算ui的最小和最大可接受值,并由此可以直接计算i的最小和最大可接受值知道@ 987654337@。然后你取(我假设)该范围内的第一个整数(例如ceil(i_min))。
标签: matlab loops while-loop