我上周开始编写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;这是一个答案吗?
那么伙计们,我做错了什么?我搜索了视频和帖子,我无法在那里找到错误。我怎么可能在间隔期间绘制它?
提前谢谢你, 佩德罗。
答案 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)
将您的向量保留为列,if 0
)HYP。