【问题标题】:comparison of loop and vectorization in matlabmatlab中循环和向量化的比较
【发布时间】:2015-03-09 07:53:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: matlab loops vectorization


    【解决方案1】:

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

    修改你的 impluse 函数如下:

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

    在您对脉冲函数的定义中,整个数组与零进行比较,返回值只是一个数字而不是向量。

    【讨论】:

      【解决方案2】:

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

      在第二个中,您将逐个遍历数组值并将其传递给函数。由于数组中包含值 0,那么你将在 f 的打印输出中从函数中返回 1(或 [0 0 1 0 0],这是一个脉冲)。

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

      也许这个例子会进一步阐明这个问题:

      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
      

      【讨论】:

      • 等一下,第一个和第二个是什么不同?在第一种情况下,我也在使用 i is not 进行迭代?
      • 我已经更改了答案以清楚地解释问题,这与其他两个旨在提供解决方案但没有真正解释问题的答案不同。我相信我的回答实际上回答了您的问题:“有什么不同?”
      【解决方案3】:

      您可以简单地将您的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
      

      绘制结果 -

      【讨论】:

        【解决方案4】:

        你可以写一个更简单的函数:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-01
          • 2015-07-06
          • 2013-02-18
          相关资源
          最近更新 更多