如何在MATLAB中对分段周期函数进行矢量化?

时间:2014-11-24 04:27:38

标签: matlab

我注意到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,...检查输入的类型,如果输入是向量产生相同的结果?

3 个答案:

答案 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