【问题标题】:How to call a custom function with exponentiation for every element of a matrix in GNU Octave?如何在 GNU Octave 中为矩阵的每个元素调用具有求幂的自定义函数?
【发布时间】:2014-02-07 22:14:05
【问题描述】:

试图找到一种方法来调用 GNU Octave 中矩阵中每个项目的自定义函数中使用的幂函数 ( ^ )。

我是一个初学者,我想这很简单,但我无法让它工作。


代码如下所示:

function result = the_function(the_val)
    result = (the_val - 5) ^ 2
endfunction


我试过这样称呼它:

>> A = [1,2,3];
>> the_function(A);
>> arrayfun(@the_function, A);
>> A .@the_function 2;

这些都不起作用(我认为最后一个根本不正确的语法),抛出错误:

error: for A^b, A must be a square matrix

我猜,这意味着它试图平方 矩阵,而不是其中的元素。

我应该怎么做?

非常感谢!

【问题讨论】:

  • 你不能用A.^b吗?这在 Matlab 中有效
  • 这实际上是我措辞中的一个错误。如果您注意到,我首先需要从元素中减去 5,然后 然后 取幂。否则,这将是一个很好的解决方案。很抱歉混淆了:S.

标签: matlab matrix octave linear-algebra exponentiation


【解决方案1】:

将函数调用为the_function(A) 是正确的,但您必须确保该函数可以处理向量输入。正如您所说,(the_val - 5)^2 尝试对矩阵求平方(因此,如果the_val 不是平方矩阵,则会出错)。要计算 element-wise 幂,请使用 use .^ 而不是 ^

所以:在你的函数的定义中,你需要改变

result = (the_val-5)^2;

result = (the_val-5).^2;

作为附加说明,由于您的代码可以使用 标量 输入,因此您也可以使用 arrayfun 方法。正确的语法是(删除@):

arrayfun(the_function, A)

然而,使用arrayfun 通常比定义你的函数要慢,这样它就可以直接处理向量输入(或“vectorizing”它)。所以,只要有可能,vectorize your function。这就是我上面的.^suggestion 所做的。

【讨论】:

  • 优秀。感谢您的建议,并为自定义函数提供了一种工作方式。我错误地认为 Octave 所做的是以某种方式为每个项目调用我的函数,但通过你的澄清,我现在明白这没有意义。干杯! :)
  • @JuanCarlosCoto 很高兴我能帮上忙 :-)
猜你喜欢
  • 2011-12-28
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多