MATLAB分段函数

时间:2016-03-18 00:44:46

标签: matlab

我必须在MATLAB中构建以下函数并遇到麻烦。

考虑通过

为[0,4]中的t定义的函数s(t)
              { sin(pi*t/2)  , for t in [0,1)
       s(t) = { -(t-2)^3     , for t in [1,3)*
              { sin(pi*t/2)  , for t in [3,4)

(i)生成由512个均匀组成的列向量       在[0,4]区间内该函数的样本。 (这个       最好通过连接三个向量来完成。)

我知道它必须是某种形式。

N = 512;
s = sin(5 * t / N)。' ;

但我需要成为分段功能,有人可以提供协助吗?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您正在尝试创建3个向量来计算所有t的特定函数输出,然后根据{{1}的实际值对每个向量进行切片并将它们连接起来。 }。这是低效的,因为你初始化的初始化量是实际需要的3倍(内存),并且计算量(CPU)也是3倍,其中大部分将被丢弃。最重要的是,如果你的t ,那么使用连接就会有点棘手(即单调增加)。这可能是一种不太可能的情况,但最好是一般的。

这里有两个选择,第一个是非常好的Matlab方式,第二个是更传统的方式(如果你来自C ++或其他东西,你可能会更习惯,我很长一段时间)。

t

请注意,当我尝试它时,传统方式&#39;虽然第一种方式(function example() t = linspace(0,4,513); % generate your time-trajectory t = t(1:end-1); % exclude final value which is 4 tic traj1 = myFunc(t); toc tic traj2 = classicStyle(t); toc end function trajectory = myFunc(t) trajectory = zeros(size(t)); % since you know the size of your output, generate it at the beginning. More efficient than dynamically growing this. % you could put an assert for t>0 and t<3, otherwise you could end up with 0s wherever t is outside your expected range % find the indices for each piecewise segment you care about idx1 = find(t<1); idx2 = find(t>=1 & t<3); idx3 = find(t>=3 & t<4); % now calculate each entry apprioriately trajectory(idx1) = sin(pi.*t(idx1)./2); trajectory(idx2) = -(t(idx2)-2).^3; trajectory(idx3) = sin(pi.*t(idx3)./2); end function trajectory = classicStyle(t) trajectory = zeros(size(t)); % conventional way: loop over each t, and differentiate with if-else % works, but a lot more code and ugly for i=1:numel(t) if t(i)<1 trajectory(i) = sin(pi*t(i)/2); elseif t(i)>=1 & t(i)<3 trajectory(i) = -(t(i)-2)^3; elseif t(i)>=3 & t(i)<4 trajectory(i) = sin(pi*t(i)/2); else error('t is beyond bounds!') end end end )肯定更快,因为你实际上扩展了很多,但有时候你的采样大小会更快。无论如何,我推荐第一种方法,因为它更容易阅读。