【问题标题】:MATLAB Piecewise functionMATLAB 分段函数
【发布时间】:2016-03-18 12:38:39
【问题描述】:

我必须在 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个uniform组成的列向量s 此函数在区间 [0,4) 上的样本。 (这个 最好通过连接三个向量来完成。)

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

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

但我需要 s 成为分段函数,有人可以提供帮助吗?

【问题讨论】:

标签: matlab


【解决方案1】:

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

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

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

请注意,当我尝试它时,“传统方式”有时会比您正在处理的采样大小更快,尽管第一种方式 (myFunc) 肯定会更快,因为您确实扩大了很多。无论如何,我推荐第一种方法,因为它更容易阅读。

【讨论】:

  • 注意:第二个区间从1到3,最后一个不包括4。那么如何获得均匀的样本是个谜。
  • 很好,已解决。为方便起见,我使用了“包括 4”(即 t
  • 无论如何,他们的家庭作业应该有一些东西;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多