MATLAB中的分段函数

时间:2018-04-25 07:45:27

标签: matlab piecewise

我最近才开始使用MATLAB for Uni今年,作为一个家庭作业测验问题,我被要求创建一个分段函数(我称之为" piecewise_method"),它能够制作一个关于" x"的不同等式取决于是否" x"低于0,介于0和8之间,或高于8.这是我到目前为止编写的代码。

function solution = piecewise_method(x)

% given the value of the input x, the function
% piecewise_method will choose from one of the three specified
% equations to enact upon the given value of x
% and give the user a solution

solution = zeros(size(x));
e = exp(1);

for j = 1:size(x)
    a = x(j);

    if a < 0
        solution(j) = -a.^3 - 2*a.^2 + 3*a;
    elseif (a >= 0) && (a <= 8)
        solution(j) = (12/pi)*sin(pi*a./4);
    else
        solution(j) = ((600.*e.^(a-8))./(7*(14+6.*e.^(a-8))) - 30/7);
    end
end

使用输入...

运行时
x = -3:12

它为变量解决方案产生了这个结果......

solution =

 0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

现在这告诉我阵列正在被正确创建,但由于某种原因,for循环没有正常运行,或者正如预期的那样。我尝试从基本级别开始多次重建for循环,但是当我开始放入方程时它又开始分崩离析,所以我相信我的方程式可能有问题(这就是为什么我把括号放到任何地方,以防万一)。

这个问题也要求我使用if语句,所以我不能尝试使用其他方法来产生分段方法函数,而且从我的搜索中看,似乎没有很多例子。分段函数中的陈述。

如果您能提供任何可以帮助我完成此功能的建议,我将不胜感激,谢谢!

P.S。如果您有任何建议可以改善我未来的问题,那也很好!

2 个答案:

答案 0 :(得分:2)

您应该在length循环使用size而不是for

size函数的输出是x的维度,对于x=-3:12的示例,它返回size(x)=[1 16]。然后,for循环将针对j=1:size(x)运行,即j=1:1,即j=1

length的输出是x的最大数组维度的长度,如列出的here。在您的示例中:length(x) = 16,然后是j=1:length(x)=1:16

或者,您可以使用size(x,2),这将返回x的第二维的大小,在这种情况下与length相同。

答案 1 :(得分:0)

如评论和RadioJava's answer中所述,您需要检查循环。我会使用size(x,2)x中的列数)或numel(x)x中的元素数量)。

for j = 1:numel(x)
    % ...

其他人建议使用length(x) max(size(x))。我通常会尽量避免这种情况,因为它不明确你想要为矩阵看哪个维度。

除了重复信息之外,我想表明你可以通过逻辑索引更有效地完成这项工作,并完全删除有问题的循环......

function solution = piecewise_method(x)

% given the value of the input x, the function
% piecewise_method will choose from one of the three specified
% equations to enact upon the given value of x
% and give the user a solution

solution = zeros(size(x));
e = exp(1);

idx = (x<0);
solution(idx) = -x(idx).^3 - 2*x(idx).^2 + 3*x(idx);
idx = (x>=0 & x<=8);
solution(idx) = (12/pi)*sin(pi*x(idx)/4);
idx = (x>8);
solution(idx) = (600*e.^(x(idx)-8))./(7*(14+6*e.^(x(idx)-8))) - 30/7;

请注意,您可以轻松地在数组中使用条件和(匿名)函数并循环它们以使其更加灵活。