在另一个.m文件中绘制函数

时间:2016-11-19 14:28:27

标签: matlab plot

我上周开始编写Matlab编程,我一直试图绘制一个函数文件但没有成功。

这是我的函数文件(impuls.m)。基本上应该将y = 0设置为0 <= x <5且x> 10。对于5 <= x <= 10),y = 5。

function y = impuls(x)

    if ((x>=0 && x<5) || x>10)
        y=0;
    else if (x>=5 && x<=10)
            y=5;
        end
    end

end

我想我做得对,因为当我使用impuls(1)在我的主文件(fourierreihe.m)上测试时,我会得到一个&#34; 0&#34;当使用冲动(7)时,我得到一个5.问题是当我试图获得间隔[0 13]的所有结果并将它们绘制为矩形脉冲时。

我尝试使用:

impuls([0 13])

但我一直收到错误:

fouhierreihen
Operands to the || and && operators must be convertible to logical scalar values.

Error in impuls (line 3)
    if ((x>=0 && x<5) || x>10)

Error in fouhierreihen (line 1)
impuls([0 13]) 

我不应该得到的东西为&#34; ans = 0 0 0 0 0 5 5 5 5 5 5 0 0 0&#34;这是一个答案吗?

那么伙计们,我做错了什么?我搜索了视频和帖子,我无法在那里找到错误。我怎么可能在间隔期间绘制它?

提前谢谢你, 佩德罗。

2 个答案:

答案 0 :(得分:1)

正如错误消息和documentation所解释的那样,短路逻辑运算符的输入必须是标量。从根本上说,尝试使用两个真值值阵列进行稳健短路是没有意义的。

您可以使用logical indexing以矢量化方式完成相同的任务。例如:

function y = impuls(x)
y = zeros(size(x));  % Initialize the output array
y(x>=5 & x<=10) = 5; % Condition one

返回:

impuls(1) =

     0


impuls(7) =

     5


impuls([0 13]) =

     0     0


impuls(0:13) =

     0     0     0     0     0     5     5     5     5     5     5     0     0     0

您的原始函数与fplot一起使用是MATLAB开发人员的一个让步。函数文档反复声明正在绘制的函数必须接受向量输入(尽管它们实际上并没有实际强制执行它):

  

该函数必须接受向量输入参数并返回向量   输出相同大小的参数

您的功能不会这样做,因为&&||是标量操作。但是,如果数组输入失败,fplot将恢复为逐个元素(循环)计算函数输出,抛出以下警告:

Warning: Function fails on array inputs. Use element-wise operators to increase speed. 
> In matlab.graphics.function.FunctionLine>getFunction
  In matlab.graphics.function.FunctionLine/updateFunction
  In matlab.graphics.function.FunctionLine/set.Function_I
  In matlab.graphics.function.FunctionLine/set.Function
  In matlab.graphics.function.FunctionLine
  In fplot>singleFplot (line 223)
  In fplot>@(f)singleFplot(cax,{f},limits,extraOpts,args) (line 182)
  In fplot>vectorizeFplot (line 182)
  In fplot (line 153)
  In trialcode (line 1) 

答案 1 :(得分:0)

我的朋友......

试试这个:

function y = impulse(t)
if 0
    %% Example
    t=(0:100)';
    y=impulse(t)
    plot(t,y);
end
for i=1:length(t)
    if ((t(i)>=0 && t(i)<5) || t(i)>10)
        y(i,1)=0;
    else if (t(i)>=5 && t(i)<=10)
            y(i,1)=5;
        end
    end
end

注意:

  • for循环在这些情况下至关重要,
  • 函数impulse可以存在于任何地方,但您的本地版本占优势,
  • y(i,1)将您的向量保留为列,
  • 在void loop(if 0
  • 中运行该部分
  • 时间通常用作变量:)....

HYP。