在不编写每个方程的情况下创建循环
Creating a loop without writing each equation
目前,如果我想添加或删除另一个 eq#
,我还必须调整 sig_min_len
和 weave
变量中的变量。
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
有没有一种方法可以只使用一个方程 eq1=sin(freq*t+deg2rad(phase));
来制作一个循环,并且在增加相位的同时也
根据循环次数 phase's
调整变量 sig_min_len
和变量 weave
?
有没有办法为变量 sig_min_len
创建一个循环,这样我就不必写出每个 length(eq#)
?
有没有办法为变量 weave
创建一个循环,这样我就不必写出每个 eq#(1:sig_min_len)
?
PS:我使用的是 Octave 3.8.1,它的工作方式类似于 matlab。
因为你的 eq#
的结构几乎相同,除了它们只有一个不同,所以这非常适合 for
循环。第二个问题的解决方案是使用元胞数组来利用其索引灵活性。元胞数组的所有成员的串联是通过使用括号实现的。 P.S。我在 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
目前,如果我想添加或删除另一个 eq#
,我还必须调整 sig_min_len
和 weave
变量中的变量。
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
有没有一种方法可以只使用一个方程
eq1=sin(freq*t+deg2rad(phase));
来制作一个循环,并且在增加相位的同时也 根据循环次数phase's
调整变量sig_min_len
和变量weave
?有没有办法为变量
sig_min_len
创建一个循环,这样我就不必写出每个length(eq#)
? 有没有办法为变量weave
创建一个循环,这样我就不必写出每个eq#(1:sig_min_len)
?
PS:我使用的是 Octave 3.8.1,它的工作方式类似于 matlab。
因为你的 eq#
的结构几乎相同,除了它们只有一个不同,所以这非常适合 for
循环。第二个问题的解决方案是使用元胞数组来利用其索引灵活性。元胞数组的所有成员的串联是通过使用括号实现的。 P.S。我在 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