我只是尝试用八度音程创建我的第一个函数,它看起来如下:
function hui(x)
if(0 <= x && x <2)
retval = (1.5 * x + 2)
elseif(2<= x && x <4)
retval = (-x + 5)
elseif(4<= x && x < 6)
retval = (0.5 * x)
elseif(6<= x && x < 8)
retval = (x - 3)
elseif(8<= x && x <=10)
retval = (2 * x - 11)
endif
endfunction
但如果我尝试使用:x=0:0.1:10; plot(x, hui(x));
它显示了一个女巫似乎有点奇怪的情节。
我错了什么?
提前致谢 约翰
答案 0 :(得分:3)
你必须原谅我的包装生锈,但你需要稍微改变一下代码。值得注意的是,符号0<=x
不正确,必须为x>=0
。由于hui
正在向量上运行,因此我认为在构造返回值时需要考虑到这一点。
我确信有更有效的矢量化方法,但基本上,当踩到输入向量时,我将最新值添加到返回向量上,最后删掉我放入的初始值0 。如果输入没有满足其中一个标准,我会输入一个标记值(它总是在你的代码中采用“else”路径,所以放一些东西可能会提醒你出错了)。
function [retval] = hui(x)
retval = 0
for i=1:size(x,2)
if(x(i)>=0 && x(i) <2)
retval = [retval (1.5 * x(i) + 2)];
elseif( x(i)>=2 && x(i) <4)
retval = [retval (-1*x(i) + 5)];
elseif(x(i)>=4 && x(i) < 6)
retval = [retval (0.5 * x(i))];
elseif(x(i)>=6 && x(i) < 8)
retval = [retval (x(i) - 3)];
elseif(x(i)>=8 && x(i) <=10)
retval = [retval (2 * x(i) - 11)];
else
retval = -999;
endif
endfor
retval = retval(2:size(retval,2));
endfunction
答案 1 :(得分:1)
x
是一个向量,因此您需要遍历它或向量化代码以消除需求。
当您使用Octave时,值得为您提供所有可能的内容。我能想到的最简单的方法是:
x = 0:0.1:10;
y = x;
y(x >= 0 & x < 2) = x(x >= 0 & x < 2) * 1.5 + 2;
y(x >= 2 & x < 4) = x(x >= 2 & x < 4) * -1 + 5;
y(x >= 4 & x < 6) = x(x >= 4 & x < 6) * 0.5;
y(x >= 6 & x < 8) = x(x >= 6 & x < 8) - 3;
y(x >= 8 & x < 10) = x(x >= 8 & x < 10) * 2 - 11;
y(x >= a & x < b)
语法是逻辑索引。单独,x >= a & x < b
为您提供逻辑值的向量,但与另一个向量组合,您将获得满足条件的值。 Octave也会让你做这样的作业。