Matlab中分段函数绘制的不一致性

Matlab中分段函数绘制的不一致性,matlab,vectorization,Matlab,Vectorization,对于大学一年级理科学生的数学课程,我们(助教)需要使用Matlab为pc课程准备材料。所有计算机均配备Matlab版本R2016b 我们正在研究前几年的一些资料。在涵盖分段函数绘图的部分中,我们发现Matlab处理if条件的方式存在一些不一致。 我想知道为什么会发生这些事情,所以我们为学生在这些课程中可能遇到的任何困难做好了准备。本练习的目标是通过绘制两个分段函数在绘图窗口中绘制房屋 第一个函数,f1(x),当MATLABx中的if-vector类似于if-all(vector)时,计算结果为

对于大学一年级理科学生的数学课程,我们(助教)需要使用Matlab为pc课程准备材料。所有计算机均配备Matlab版本R2016b

我们正在研究前几年的一些资料。在涵盖分段函数绘图的部分中,我们发现Matlab处理
if
条件的方式存在一些不一致。

我想知道为什么会发生这些事情,所以我们为学生在这些课程中可能遇到的任何困难做好了准备。本练习的目标是通过绘制两个分段函数在绘图窗口中绘制房屋



第一个函数,
f1(x)
,当MATLAB
x中的
if-vector
类似于
if-all(vector)
时,计算结果为
x+2
,这就是错误的根源。请改用索引:

function y = f2( x )
y = zeros(size(x));  
idxs1 = x >= -1;
idxs2 = x <= 1;
y(idxs1 & idxs2) = 1;
end

function y = f1( x )
y = zeros(size(x));  
idxs = x < 0;
y(idxs) = x(idxs) + 2;
y(~idxs) = -x(~idxs) + 2;
end

fplot(@f1, [-1.5, 1.5])
hold on
fplot(@f2, [-1.5, 1.5])
函数y=f2(x)
y=零(尺寸(x));
idxs1=x>=-1;

idxs2=x在MATLAB
中,如果向量
类似于
如果全部(向量)
,那么这就是错误的来源。请改用索引:

function y = f2( x )
y = zeros(size(x));  
idxs1 = x >= -1;
idxs2 = x <= 1;
y(idxs1 & idxs2) = 1;
end

function y = f1( x )
y = zeros(size(x));  
idxs = x < 0;
y(idxs) = x(idxs) + 2;
y(~idxs) = -x(~idxs) + 2;
end

fplot(@f1, [-1.5, 1.5])
hold on
fplot(@f2, [-1.5, 1.5])
函数y=f2(x)
y=零(尺寸(x));
idxs1=x>=-1;

idxs2=x使用If语句

您说您想专门使用
if
结构,在这种情况下,您必须依次计算输入向量的每个元素

function y = f1( x )
y = zeros(size(x));  % Initialise y to the correct size
for ii = 1:numel(x)  % Loop through elements of x (and so y)
    if x(ii) < 0
        y(ii) = x(ii) + 2;
    else
        y(ii) = -x(ii) + 2;
    end
end
end
然后,您的演示将给出所需的结果


至于你在改变分段函数的一部分和一切工作时的奥秘。。。对我来说,你的代码无论如何都是有效的(2015b)!我猜这与
fplot
调用函数的方式有关。我目前无法访问可能包含答案的文档。在上面的示例中,我假设
x
作为向量传递(可能有1个或多个元素)。如果
fplot
确定
x
值并调用函数,就像调用单点一样,那么代码应该可以工作

编辑任务以使事情更清楚的一种方法可能是只使用正常的
绘图
功能
,我认为这对学生来说更有用,无论如何都要熟悉

然后你的演示会被这样调用

x = -1.5:0.1:1.5  % or could use linspace(-1.5, 1.5, 100) etc
hold on;
plot(x, f1(x));   % x,y syntax, more apparent where the points will be plotted
plot(x, f2(x));   %   than when using fplot
hold off;         % good habit to hold off so that you don't accidentally plot on this fig later

请注意,对于
x
,有了这个清晰的定义,
-x^2+2
将在请求一维向量的矩阵乘法时抛出一个错误。实际上,您必须使用
-x.^2+2
。有一个提示让学生学习Matlab中的元素操作

使用If语句

您说您想专门使用
if
结构,在这种情况下,您必须依次计算输入向量的每个元素

function y = f1( x )
y = zeros(size(x));  % Initialise y to the correct size
for ii = 1:numel(x)  % Loop through elements of x (and so y)
    if x(ii) < 0
        y(ii) = x(ii) + 2;
    else
        y(ii) = -x(ii) + 2;
    end
end
end
然后,您的演示将给出所需的结果


至于你在改变分段函数的一部分和一切工作时的奥秘。。。对我来说,你的代码无论如何都是有效的(2015b)!我猜这与
fplot
调用函数的方式有关。我目前无法访问可能包含答案的文档。在上面的示例中,我假设
x
作为向量传递(可能有1个或多个元素)。如果
fplot
确定
x
值并调用函数,就像调用单点一样,那么代码应该可以工作

编辑任务以使事情更清楚的一种方法可能是只使用正常的
绘图
功能
,我认为这对学生来说更有用,无论如何都要熟悉

然后你的演示会被这样调用

x = -1.5:0.1:1.5  % or could use linspace(-1.5, 1.5, 100) etc
hold on;
plot(x, f1(x));   % x,y syntax, more apparent where the points will be plotted
plot(x, f2(x));   %   than when using fplot
hold off;         % good habit to hold off so that you don't accidentally plot on this fig later
请注意,对于
x
,有了这个清晰的定义,
-x^2+2
将在请求一维向量的矩阵乘法时抛出一个错误。实际上,您必须使用
-x.^2+2
。有一个提示让学生学习Matlab中的元素操作

If(逻辑_向量)根据所有元素进行分支,适用于所有元素。它与if(all(logical_vector))相同。尝试以下方法:
f1(1)
f1(-1)
f1([-1,1])
f1([1,-1])
f1([1,-1,1])
至于你的问题-在2015a,它很好地描绘了房子,所以我在这里帮不了你。如果(逻辑向量)根据所有元素,为所有元素选择分支。它与if(all(logical_vector))相同。尝试以下操作:
f1(1)
f1(-1)
f1([-1,1])
f1([1,-1])
f1([1,-1,1])
至于你的问题-在2015a,它很好地绘制了房子,所以我在这里帮不了你。在MATLAB中,如果向量类似于
如果全部(向量)
除非向量器为空,否则MATLAB
if vector
类似于
if all(vector)
除非向量器为空
x = [1, 2, -1, 3, -2];
y = -x + 2;     % Initialise variable y, assign its values to -x + 2 by default
y(x<0) = x + 2; % Assign values of y, where x<0, to x + 2
coef = (x < 0)*2 - 1; % For the above example, coef = [-1, -1, 1, -1, 1];
y = coef.*x + 2;      % Coeff can be done in-line without being declared
function y = f1(x)
    y = ((x<0)*2 - 1).*x + 2;
end

function y = f2(x)
    y = (abs(x) < 1);  
end
x = -1.5:0.1:1.5  % or could use linspace(-1.5, 1.5, 100) etc
hold on;
plot(x, f1(x));   % x,y syntax, more apparent where the points will be plotted
plot(x, f2(x));   %   than when using fplot
hold off;         % good habit to hold off so that you don't accidentally plot on this fig later