【问题标题】:vectorize a function with multiple variables向量化具有多个变量的函数
【发布时间】:2021-03-14 20:53:51
【问题描述】:

考虑任意函数:

function myFunc_ = myFunc(firstInput, secondInput)
    myFunc_ = firstInput * secondInput;
end

现在想象一下,我想将上述函数映射到第一个输入 firstInput 的数组,而第二个输入 secondInput 是常量。例如,类似:

firstVariable = linspace(0., 1.);

plot(firstVariable, map(myFunc, [firstVariable , 0.1]))

其中0.1secondInput 的任意标量值,firstVariable 数组是firstInput 的任意数组。

我研究了arrayfun() 函数。但是,我不知道如何包含常量变量。另外,MATLAB 和 Octave 之间的语法似乎不同,或者我弄错了。拥有一个可以与同事共享的交叉兼容代码对我来说很重要。

【问题讨论】:

  • 也许我误解了map(fun, argv) 的意思,但plot(firstVariable, myFunc(firstVariable, 0.1)) 不够吗?
  • @Vicky myFunc(firstVariable, 0.1)) 在 Octave 中返回一个标量。我不知道它在 MATLAB 上的作用!
  • myFunc(firstVariable, 0.1) 在 MATLAB 中返回一个向量!!如果在函数定义中用元素.* 替换* 会发生什么,这有什么不同吗? (octave.org/doc/v6.2.0/Broadcasting.html)

标签: matlab octave


【解决方案1】:

假设在原始函数中您将两个标量相乘并且您想要向量化,那么

function myFunc_ = myFunc(firstInput, secondInput)
    myFunc_ = firstInput .* secondInput;
end

应该可以正常工作。

然后直接绘制:

plot( firstVariable, myFunc(firstVariable , 0.1) )

【讨论】:

  • 这就是我在阅读文档时所怀疑的!
  • 不,恐怕实际代码不像原始问题中给出的示例那么简单。我想我找到了适用于 Octave 的正确语法。我会把它贴在下面给那些最终来到这里的人。
  • 也许我在这里犯了一个错误,但我正在 this paper 上实现等式 26。而且我确实在实际代码中使用了元素算术运算符。
  • @Foad:你没有理由不能简单地向量化这个方程。您首先计算三个组件中的每一个,例如r1r2r3,它们都是数组,然后您计算max(max(r1,r2),r3) 以找到这三个组件中的元素最大值。计算 max([r1,r2,r3]) 可能会产生一个标量。
  • @Foad:更改您的 tmp0 函数,正如我在上面的评论中指出的那样。
【解决方案2】:

恐怕原始问题中给出的任意示例过于简化,因此,它们并不代表我在代码中面临的实际问题。但我确实设法找到了适用于 Octave 的正确语法:

plot(firstVariable, arrayfun(@(tempVariable) myFunc(tempVariable, 0.1), firstVariable))

基本上是

@(tempVariable) myFunc(tempVariable, 0.1)

创建所谓的匿名函数和

arrayfun(<function>, <array>)

将函数映射到给定的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2017-12-17
    • 2016-03-16
    相关资源
    最近更新 更多