【问题标题】:Creating a loop without writing each equation创建一个循环而不写每个方程
【发布时间】:2015-09-09 03:18:53
【问题描述】:

目前,如果我想添加或删除另一个eq#,我还必须调整sig_min_lenweave 变量中的变量。

fs=60000
t=linspace(0,2*pi,fs); %creates same size time 
freq=100;
for phase=1:360
    phase
    eq1=sin(freq*t+deg2rad(phase));
    eq2=sin(freq*t+deg2rad(phase+1));
    eq3=sin(freq*t+deg2rad(phase+2));
    eq4=sin(freq*t+deg2rad(phase+3));
    sig_min_len = min([ length(eq1), length(eq2)  , length(eq3), length(eq4)]); %get min length
    weave=reshape([[eq1(1:sig_min_len)];[eq2(1:sig_min_len)];[eq3(1:sig_min_len)];[eq4(1:sig_min_len)]],1,[])'; %interweave to row vectors into one col vector
end
  1. 有没有一种方法可以只使用一个方程 eq1=sin(freq*t+deg2rad(phase)); 来创建一个循环,并在相位增量的同时 根据我循环的phase's 的数量调整变量sig_min_len 和变量weave

  2. 有没有办法为变量sig_min_len 进行循环,这样我就不必写出每个length(eq#)? 有没有办法为变量 weave 创建一个循环,这样我就不必写出每个 eq#(1:sig_min_len) 了?

PS:我使用的是 Octave 3.8.1,它的工作原理类似于 matlab。

【问题讨论】:

    标签: matlab for-loop octave


    【解决方案1】:

    由于您的eq# 的结构几乎相同,只是它们相差一个,这为for 循环提供了完美的案例。第二个问题的解决方案是使用元胞数组来利用其索引灵活性。元胞数组的所有成员的串联是通过使用括号来实现的。附言我在 MATLAB 中这样做。我认为它的工作原理与 Octave 几乎相同。

    fs=60000
    t=linspace(0,2*pi,fs);
    freq=100;
    for phase=1:360
        phase
        for ii = 1:4
            eq{ii} = sin(freq*t+deg2rad(phase+ii-1));
            sig_min_len = min(length(eq{ii}), length(eq{ii-1*(ii~=1)}))
        end
        weave=[eq{:}].';
    end
    

    ii == 1 时,表达式min(length(eq{ii}), length(eq{ii-1*(ii~=1)})) 的计算结果为min(length(eq{1}), length(eq{1)}))。它比类似的 if 语句要简洁得多:

    if ii = 1
        sig_min_len = length(eq{ii})
    else
        sig_min_len = min(length(eq{ii}), length(eq{ii-1}))
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 2012-08-11
      • 2012-09-27
      • 2016-04-13
      • 2019-12-15
      • 2021-09-24
      相关资源
      最近更新 更多