我最近才开始使用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。如果您有任何建议可以改善我未来的问题,那也很好!
答案 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;
请注意,您可以轻松地在数组中使用条件和(匿名)函数并循环它们以使其更加灵活。