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

时间:2013-12-02 05:43:17

标签: performance matlab if-statement for-loop sampling

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

代码如下。

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开始,但输出甚至比这更差,但如果这是一个可行的选项,请详细解释,应该如何完成。< / p>

我已经尝试在一个for-loop中使用一个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); index必须是正整数或逻辑。

编辑/成功 - 4

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

2 个答案:

答案 0 :(得分:3)

根据我的理解,您希望使用单个[-30, 30]循环迭代0中除for之外的所有整数值。这可以很容易地完成:

for ii = [-30:-1,1:30]
    %Your code
end

编辑决议 - 2

根据您更新的代码,尝试替换

xn(rem(n,N)==0) = -(cos(.1*pi*n)-(4*sin(.2*pi*n)));

xn(rem(n,N)==0) = -(cos(.1*pi*n(rem(n,N)==0))-(4*sin(.2*pi*n(rem(n,N)==0))));

这应该可以解决尺寸不匹配问题。

编辑决议 - 3

尝试:

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

答案 1 :(得分:3)

您可以执行以下操作:

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)));