【问题标题】:vectorize a constant function in octave向量化一个八度的常数函数
【发布时间】:2020-07-04 04:56:10
【问题描述】:

我在尝试定义一个将向量作为参数的常量函数时遇到了这种存在问题:

我想定义一个类似的函数:

>f=@(x) 0.0;           % a constant function (zero or any other constant value).
>xx=linspace(0,10,10); % ten values where I want to evaluate the function

当我运行它时,我得到:

>> f(xx)
ans = 0

我真的期待一个零向量。 (我看不到如何将矢量化功能合并到常量函数中)

有没有人能解决这个简单的问题? 提前致谢!

【问题讨论】:

  • 我真的期待一个零向量 f=@(x) 0.0 定义了一个简单地输出0 的函数。 f = @(x) zeros(size(x))是你想要的吗?
  • @(x)x*0 也可以。如果你不在你的函数中使用x,那么它的输出就独立于它的输入。您是否期望依次为输入的每个元素调用该函数? Octave 不是这样工作的。
  • 好的,@LuisMendo 在那个 cse 中,它只适用于零值常量函数,但不适用于 f=@(x) 3.0,对吗?我希望输出为 3... 我认为它可以设置为:f=@(x) a*ones(1,size(x));
  • @CrisLuengo @(x)x*0 对于另一个常数 0 也不起作用。“您是否希望依次为输入的每个元素调用该函数?”。我想这就是我想要的!。
  • 所以,也许f = @(x) repmat(a,size(x)) 是您所追求的。我真的没有得到你想要的,对不起

标签: matlab octave


【解决方案1】:

要按照输入形状的指示重复常量a,您可以使用

f = @(x) repmat(a, size(x));

例子:

>> a = 5;
>> f = @(x) repmat(a,size(x));
>> f([10 20 30; 40 50 60])
ans =
     5     5     5
     5     5     5

【讨论】:

    【解决方案2】:

    好的,所以从上面的 cmets 中,您需要一个函数,该函数将返回一个与输入大小相同的数组,但所有值都等于某个预定义的常量。

    @Luis 的上述方法将起作用。这些天我不确定 Matlab,但至少在旧版本中,并且在 Octave repmat 中并不是最快的,并且还有其他开销较低的生成重复数组的方法。如果它是一个可能会被大量调用的函数,我更喜欢使用ones() 数组扩展。 (它还与广播很好地结合在一起,在这种情况下不是必需的)。

    例如:

    >> f = @(x)  repmat(5,size(x));
    
    >> f([10 20 30; 40 50 60])
    ans =
         5     5     5
         5     5     5
    
    >> g = @(x) 5*ones(size(x));
    
    >> g([10 20 30; 40 50 60])
    ans =
         5     5     5
         5     5     5
    

    做一个快速而肮脏的循环来估计时间要求,我们看到在 Octave 5.2.0 中,对于相同的操作,repmat 版本需要大约 5 倍的时间:

    >> tic;for idx = 1:1e4, f(rand(4,2,3));endfor,toc
    Elapsed time is 1.54 seconds.
    
    >> tic;for idx = 1:1e5, f(rand(4,2,3));endfor,toc
    Elapsed time is 17.6487 seconds.
    
    >> tic;for idx = 1:1e4, g(rand(4,2,3));endfor,toc
    Elapsed time is 0.337171 seconds.
    
    >> tic;for idx = 1:1e5, g(rand(4,2,3));endfor,toc
    Elapsed time is 3.06284 seconds.
    

    仅供参考,这是我从 Pascal Getreuer's "Writing Fast MATLAB Code" 中获得的,如果在 Octave 中工作,我强烈推荐它,因为它目前没有 Matlab 近年来实现的许多代码加速。

    【讨论】:

    • 好点。在 Matlab R201b 中,它们似乎同样快
    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多