我想定义一个Matlab函数,如下图所示,但是沿着t轴定期重复。</ p>
到目前为止,我尝试了两种不同的代码:
function Borne = borne(p)
pxt = x;
Borne = zeros(size(pxt));
i0 = (pxt <= 0.1);
i1 = (pxt > 0.1 & pxt < 0.3);
i2 = (pxt > 0.3 & pxt < 0.5);
i3 = (pxt > 0.5 & pxt < 0.7);
i4 = (pxt > 0.7 & pxt < 0.9);
i5 = (pxt > 0.9 & pxt < 1.1);
Borne(i0) = 3;
Borne(i1) = -1;
Borne(i2) = 3;
Borne(i3) = -1;
Borne(i4) = 3;
Borne(i5) = -1;
这个可行,但我可能不得不去时间= 100。
function Borne = borne(p)
x=0:0.2:100;
y=ones(1,length(x));
for i=1:length(x)
if mod(i,2) == 1;
y(i)=3;
else
y(i)=-1;
end
end
Borne=stairs(x,y);
这个根本不起作用,它给我一个大约147的恒定功能。此外,在for循环结束时,x和y都有length = 1,我不知道为什么。
是否有更好的方法来定义我的功能?如果没有,我该如何改进我的代码? 非常感谢你!
答案 0 :(得分:3)
您可以使用余数(rem
)函数和逻辑索引进行一次性操作:
%// Data
period = 1;
up_start = .1;
up_stop = .4;
up_value = 3;
down_value = -1;
x = linspace(0,10,200); %// x axis
%// Generate function
Borne = zeros(size(x)); %// initiallize
aux = rem(x,period);
ind = (aux>=up_start) & (aux<up_stop); %// index of "up" values
Borne(ind) = up_value;
Borne(~ind) = down_value;
答案 1 :(得分:1)
如果您想要2,4,6等步骤,可以使用cumsum
:
t = (1:14).*0.1;
x(2:4:12) = -4;
x(4:4:14) = 4;
x(1) = 3;
y = cumsum(x);
[t; y] =
1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 1 1 0 0 1 1 0 0 1 1 0 0 1
这样做的方法是,首先创建一个+1和-1的向量,在这里你想要步骤。 cumsum
将获取此向量的累积和,从而在1和0之间进行更改。
如果需要,可以使用stairs
进行绘制。
使用您的值,这将是:
n = 8; % Don't know the length of t
t = (0:n).*0.1;
x = zeros(1, length(t));
x(2:4:length(t)) = -4;
x(4:4:length(t)) = 4;
x(1) = 3;
y = cumsum(x);
[t; y] =
0.00000 0.10000 0.20000 0.30000 0.40000 0.50000 0.60000 0.70000
3.00000 -1.00000 -1.00000 3.00000 3.00000 -1.00000 -1.00000 3.00000
答案 2 :(得分:1)
这样的事情不需要复杂的代码。您可以使用square
函数,它是大多数Matlab发行版附带的信号处理工具箱的一部分:
miny = -1; % Minimum amplitude
maxy = 3; % Maximum amplitude
period = 0.4; % Period in Hz, 1/frequency
duty = 0.5; % Duty cycle, percentage of time spent at maxy
offset = 0.1; % Phase offset in sec.
t = 0:0.01:3;
y = 0.5*(maxy-miny)*square(2*pi*(t-offset)/period,duty*100)-miny;
figure;
plot(t,y)
axis([t(1) t(end) miny-0.1*(maxy-miny) maxy+0.1*(maxy-miny)])