我注意到matlab内置函数可以处理标量或矢量参数。例如:
sin(pi/2)
ans =
1
sin([0:pi/5:pi])
ans =
0 0.5878 0.9511 0.9511 0.5878 0.0000
如果我编写自己的函数,例如,分段周期函数:
function v = foo(t)
t = mod( t, 2 ) ;
if ( t < 0.1 )
v = 0 ;
elseif ( t < 0.2 )
v = 10 * t - 1 ;
else
v = 1 ;
end
我可以用个人价值来称呼它:
[foo(0.1) foo(0.15) foo(0.2)]
ans =
0 0.5000 1.0000
但是,如果函数的输入是向量,则它不像内置函数那样自动向量化:
foo([0.1:0.05:0.2])
ans =
1
是否有可用于函数定义的语法,表明如果提供了向量,则应生成向量?或者做内置函数,如sin,cos,...检查输入的类型,如果输入是向量产生相同的结果?
答案 0 :(得分:3)
您需要稍微更改语法才能处理任何大小的数据。我通常使用逻辑过滤器来矢量化if语句,正如您尝试的那样:
function v = foo(t)
v = zeros(size(t));
t = mod( t, 2 ) ;
filt1 = t<0.1;
filt2 = ~filt1 & t<0.2;
filt3 = ~filt1 & ~filt2;
v(filt1) = 0;
v(filt2) = 10*t(filt2)-1;
v(filt3) = 1;
在此代码中,我们有三个逻辑过滤器。第一个选择t<0.1
的所有元素。第二个选择了t<0.2
所有不在第一个过滤器中的元素。最后的过滤器可以获得其他所有东西。
然后我们使用它来设置向量v
。我们将v
中与第一个过滤条件匹配的每个元素设置为0
。我们将v
中与第二个过滤条件匹配的所有内容设置为10*t-1
。我们将v
的每个与第三个过滤器匹配的元素设置为1
。
要更全面地了解矢量化,请检查其上的MATLAB help page。
答案 1 :(得分:0)
最小化操作次数的简单方法是:
function v = foo(t)
t = mod(t, 2);
v = ones(size(t)) .* (t > 0.1);
v(t < 0.2) = 10*t(t < 0.2) - 1;
end
如果向量很大,那么ind = t < 0.2
可能会更快,并在最后一行中使用它。这样你只需搜索一次数组。此外,乘法可能会被带有逻辑索引的额外行代替。
答案 2 :(得分:0)
我反复遇到同样的问题,因此我一直在寻找更通用的解决方案,并提出了这个问题:
superUrlValidation
现在是pw的代码
.source