Matlab定义了几个步骤函数

时间:2013-12-15 11:25:57

标签: matlab function

我想定义一个Matlab函数,如下图所示,但是沿着t轴定期重复。<​​/ p>

enter image description here

到目前为止,我尝试了两种不同的代码:

    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,我不知道为什么。

是否有更好的方法来定义我的功能?如果没有,我该如何改进我的代码? 非常感谢你!

3 个答案:

答案 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;

enter image description here

答案 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)])