这是Matlab函数调用中的错误吗?

时间:2016-06-13 11:05:44

标签: matlab function debugging call

我在这里使用的代码是为了说明可能的错误。在代码中,我定义了三个函数,并尝试将它们可视化。

第一个:

$$y_1(x)=5\sin(x)$$

第二个:

$$y_2(x)=12-8\cos(x)$$

第三部分是以上两者的分段组合:

when x<0:
$$y_3(x)=y_1(x)$$

when x>=0:

$$y_3(x)=(y_1(x)+y_2(x))/2$$

当我在Matlab中运行以下代码时,保存为m2mPlot.m

function m2mPlot
clear all
close all
clc

global a b c;
a=12;
b=8;
c=5;
t=-pi:.1:pi;

plot(t,y1(t),'b')
hold on
plot(t,y2(t),'m')
plot(t,y3(t),'r')
legend('y1','y2','y3')


function y=y1(t)
% The first function for testing
global c;
y=c*sin(t);

function y=y2(t)
% The 2nd function for testing
global a b;
y=a-b*cos(t);

function y=y3(t)
% The 3rd function for testing
if t<0  % It seems this logic value is always FALSE, why?
    y=y1(t);
else
    y=(y2(t)+y1(t))/2;
end

我得到了:

enter image description here 这表明在第三个子函数中逻辑表达式:t <0始终为FALSE,无论实际值是多少。

这是Matlab中的错误吗?如何避免这样的问题?

1 个答案:

答案 0 :(得分:2)

这不是MATLAB中的错误,您只是错误地使用它。

您正在呼叫y3(t),其中t是一个向量,即t=-pi:.1:pi;。但y3的代码在条件中使用t,即if t<0。由于t<0的结果是向量,并且if语句需要标量,因此它不会按预期工作。正如Troy Haskin在评论中指出的那样,来自MATLAB docs

  

如果expression,statements,end计算表达式,并在表达式为true时执行一组语句。当结果为非空并且仅包含非零元素(逻辑或实数)时,表达式为true。   否则,表达式为false。

您的t<0向量包含许多false个值,因此if会将其评估为false。我建议你只需要给MATLAB if一个标量。

如果您想以矢量化方式创建y3函数,请尝试改为:

function y=y3(t)
    y=y1(t).*(t<0) + y2(t).*(t>=0);
end