创建循环而不编写每个等式

时间:2015-09-09 03:18:53

标签: matlab for-loop octave

目前,如果我想添加或删除其他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));制作一个循环,并且还具有相位增量 根据我循环的sig_min_len次数调整变量weave和变量phase's

  2. 有没有办法为变量sig_min_len制作一个循环,所以我不必写出每个length(eq#)? 有没有办法为变量weave制作一个循环,所以我不必写出每个eq#(1:sig_min_len)

  3. PS:我使用的是Octave 3.8.1,就像matlab一样。

1 个答案:

答案 0 :(得分:0)

由于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

min(length(eq{ii}), length(eq{ii-1*(ii~=1)}))表达式min(length(eq{1}), length(eq{1)}))ii == 1时评估为if。它比想要这样的同等if ii = 1 sig_min_len = length(eq{ii}) else sig_min_len = min(length(eq{ii}), length(eq{ii-1})) end 语句简洁得多:

--showcommands