如何避免for循环中的else语句?

固相线

我有一个代码可以产生类似于所需输出的解决方案,而且我不知道如何完善此解决方案。

代码如下。

N = 4; % sampling period
for nB = -30:-1; 
  if rem(nB,N)==0
    xnB(abs(nB)) = -(cos(.1*pi*nB)-(4*sin(.2*pi*nB))); 
  else
    xnB(abs(nB)) = 0;
  end
end
for nC = 1:30; 
  if rem(nC,N)==0
    xnC(nC) = cos(.1*pi*nC)-(4*sin(.2*pi*nC)); 
  else
    xnC(nC) = 0;
  end
end
nB = -30:-1; 
nC = 1:30;
nD = 0;
xnD = 0;
plot(nA,xnA,nB,xnB,'r--o',nC,xnC,'r--o',nD,xnD,'r--o')

这样会产生一些接近的东西,但距离不够接近,无法进行正确的数据恢复。

我试过使用具有相同长度但只是从其开始的索引,1但是输出甚至比这差,尽管如果这是一个可行的选择,请彻底解释,应如何做。

我试过将它for-loop与1一起运行if-statement但是当计数器传递零时会出现问题。有什么办法可以避免使用两个for-loops(我非常有信心,解决此问题将提高输出的准确性,足以成功恢复信号。)

编辑/澄清/添加-1

实际上,我确实想在零索引处评估信号。if-statement不能处理的零指数,这是一个索引,我不希望跳过。

这段代码的目标是能够对信号进行采样,然后我将构建一个将其放入恢复滤波器的代码。

编辑/更新-2

nA = -30:.1:30; % n values for original function
xnA = cos(.1*pi*nA)-(4*sin(.2*pi*nA)); % original function
N = 4; % sampling period
n = -30:30;
xn = zeros(size(n));
xn(rem(n,N)==0) = -(cos(.1*pi*n)-(4*sin(.2*pi*n)));
plot(nA,xnA,n,xn,'r--o')
title('Original seq. x and Sampled seq. xp')
xlabel('n')
ylabel('x(n) and xp(n)')
legend('original','sampled');

这在以下行上引发了一个错误xn(rem(n,N)==0) = -(cos(.1*pi*n)-(4*sin(.2*pi*n)));在分配A(I)= B中,B和I中的元素数必须相同。我以前曾遇到过此错误,但我以前的遭遇通常是错误循环的结果。有人可以指出为什么这次不起作用吗?

编辑/说明-3

N = 4; % sampling period
for nB = -30:30;
    if rem(nB,N)==0
        xnB(abs(nB)) = -(cos(.1*pi*nB)-(4*sin(.2*pi*nB)));
    else
        xnB(abs(nB)) = 0; 
    end
end

产生的错误消息如下:尝试访问xnB(0); 索引必须为正整数或逻辑。

编辑/成功-4

再看一下发布的答案后,我意识到cos函数前面的负号不应该出现在原始编码中。

姆兹扎曼

您可以执行以下操作:

nB = -30:1
nC = 1:30
xnB = zeros(size(nB));
remB = rem(nB,N)==0;
xnB(remB) = -cos(.1*pi*nB(remB))-(4*sin(.2*pi*nB(remB));
xnC = zeros(size(nC));
remC = rem(nC,N)==0;
xnC(remC) = cos(.1*pi*nC(remC))-(4*sin(.2*pi*nC(remC)));

这避免了完全具有for循环的问题。但是,这将产生与以前完全相同的输出,因此我不确定它是否可以解决您的最初问题...

编辑您最近添加的内容:

nB = -30:30;
xnB = zeros(size(nB));
remB = rem(nB,N)==0;
xnB(remB) = -(cos(.1*pi*nB(remB))-(4*sin(.2*pi*nB(remB)));

在您的原始帖子中,您的符号依赖于nB的符号-如果要维护此功能,请执行以下操作:

xnB(remB) = sign(nB(remB).*(cos(.1*pi*nB(remB))-(4*sin(.2*pi*nB(remB)));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章