matlab中循环和矢量化的比较

时间:2015-03-09 07:53:03

标签: matlab loops vectorization

让我们考虑下面的脉冲函数代码

function y=impulse_function(n);
y=0;
if n==0
    y=1;
end
end

此代码

>> n=-2:2;
>> i=1:length(n);
>> f(i)=impulse_function(n(i));
>> 

返回结果

 f

f =

     0     0     0     0     0

这段代码

>> n=-2:2;
>> for i=1:length(n);
f(i)=impulse_function(n(i));
end
>> f

f =

     0     0     1     0     0

在这两种情况下我都是1 2 3 4 5,有什么不同?

4 个答案:

答案 0 :(得分:1)

在第一种情况下,您将数组与值0进行比较。这将得到结果[0 0 1 0 0],这不是简单的真或假。因此,语句y = 0;将不会被执行,f将为[0 0 0 0 0],如图所示。

在第二步中,您按值迭代数组值并将其传递给函数。由于数组包含值0,因此您将从f(或[0 0 1 0 0]的打印输出函数返回1,这是一个冲动)。

您需要修改函数以获取数组输入。

也许这个例子将进一步澄清问题:

cond = 0;
if cond == 0
    disp(cond) % This will print 0 since 0 == 0
end

cond = 1;
if cond == 0
    disp(cond) % This won't print since since 1 ~= 0 (not equal)
end

cond = [-2 -1 0 1 2];
if cond == 0
    disp(cond) % This won't print since since [-2 -1 0 1 2] ~= 0 (not equal)
end

答案 1 :(得分:1)

您的函数未定义为处理矢量输入。

修改你的impluse函数,如下所示:

function y=impulse_function(n)
    [a b]=size(n);
    y=zeros(a,b);
    y(n==0)=1;
end

在你对impulse_function的定义中,整个数组被比较为零,返回值只是一个数而不是一个向量。

答案 2 :(得分:1)

您可以将impulse function简单地定义为 -

impulse_function = @(n) (1:numel(n)).*n==0

示例运行 -

>> n = -6:4
n =
    -6    -5    -4    -3    -2    -1     0     1     2     3     4
>> out = impulse_function(n)
out =
     0     0     0     0     0     0     1     0     0     0     0

绘图代码 -

plot(n,out,'o')    %// data points
hold on
line([0 0],[1 0])  %// impulse point

绘制结果 -

enter image description here

答案 3 :(得分:0)

你可以写一个更简单的功能:

function y=impulse_function(n);
y = n==0;

请注意,这将返回y作为类型逻辑数组,但不应影响以后的数值计算。