【问题标题】:How can I avoid if else statements within a for loop?如何避免 for 循环中的 if else 语句?
【发布时间】:2013-12-02 05:43:17
【问题描述】:

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

代码如下。

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 和一个 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

产生的错误信息如下: Attempted to access xnB(0); index 必须是正整数或逻辑整数。

编辑/成功 - 4

再看了一遍贴出来的答案后,我意识到 cos 函数前面的负号不应该在原始编码中。

【问题讨论】:

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


    【解决方案1】:

    您可以执行以下操作:

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

    【讨论】:

    • 我刚刚尝试将变量 nbnc 添加到一个变量中 n 不幸的是它抛出了一个错误 **In an assignment A(I) = B, the number of elements in B and I must be the same.** 我会编辑我的问题给你看我试过了。
    • @SolidusVerum:试试xnB(rem(nB,N)==0) = -cos(.1*pi*nB(rem(nB,N)==0))-(4*sin(.2*pi*nB(rem(nB,N)==0)));xnC(rem(nC,N)==0) = cos(.1*pi*nC(rem(nC,N)==0))-(4*sin(.2*pi*nC(rem(nC,N)==0)));
    • 哎呀,对不起。我的监督。
    • @RoneyMichael 即使使用这个更新后的代码,仍然无法摆脱不使用零的事实。
    • @SolidusVerum:请发布您收到的任何错误消息。说代码不通过是不够的。
    【解决方案2】:

    据我了解,您希望使用单个 for 循环遍历 [-30, 30] 中的所有整数值,不包括 0。这可以很容易地做到:

    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
    

    【讨论】:

    • 我将编辑我的问题以澄清我想包含零值,你知道该怎么做吗?
    • @SolidusVerum:你能澄清一下吗?为什么if 声明在这里有缺陷?如果循环迭代为零,您期望什么?
    • 当我尝试将nbnc 放在一个变量中并在循环中使用if 语句时,它会一直工作,直到索引变为零,然后matlab 停止循环。
    • @SolidusVerum:据我所知,这不应该发生。请发布失败的确切代码和错误消息(如果有)。
    • 我试过的代码是这样的:......好吧,我只是把它放在原始问题中以便于查看,因为我无法弄清楚行引号。 >N = 4; % 采样周期 >for nB = -30:30; >if rem(nB,N)==0 >xnB(abs(nB)) = -(cos(.1*pinB)-(4*sin(.2*pinB)) ); >否则 >xnB(abs(nB)) = 0; >end >end 产生的错误信息是:Attempted to access xnB(0); index 必须是正整数或逻辑整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多