我必须在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)。' ;
但我需要成为分段功能,有人可以提供协助吗?
答案 0 :(得分:0)
如果我理解正确,您正在尝试创建3个向量来计算所有t
的特定函数输出,然后根据{{1}的实际值对每个向量进行切片并将它们连接起来。 }。这是低效的,因为你初始化的初始化量是实际需要的3倍(内存),并且计算量(CPU)也是3倍,其中大部分将被丢弃。最重要的是,如果你的t
不,那么使用连接就会有点棘手(即单调增加)。这可能是一种不太可能的情况,但最好是一般的。
这里有两个选择,第一个是非常好的Matlab方式,第二个是更传统的方式(如果你来自C ++或其他东西,你可能会更习惯,我很长一段时间)。
t
请注意,当我尝试它时,传统方式'虽然第一种方式(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
)肯定更快,因为你实际上扩展了很多,但有时候你的采样大小会更快。无论如何,我推荐第一种方法,因为它更容易阅读。