【问题标题】:summing functions handles in matlabmatlab中的求和函数句柄
【发布时间】:2011-01-16 09:37:56
【问题描述】:


我正在尝试对两个函数句柄求和,但它不起作用。 例如:

y1=@(x)(x*x);
y2=@(x)(x*x+3*x);
y3=y1+y2

我收到的错误是“???未定义的函数或方法 'plus' 用于类型 'function_handle' 的输入参数。”

这只是一个小例子,实际上我实际上需要迭代求和大约 500 个相互依赖的函数。

编辑
Clement J. 的解决方案确实有效,但我无法将其概括为一个循环并遇到问题。我有函数s=@(x,y,z)((1-exp(-x*y)-z)*exp(-x*y)); 并且我有一个包含 536 个数据点的向量 v 和另一个也包含 536 个数据点的向量 w。我的目标是总结 s(v(i),y,w(i)) for i=1...536 从而在变量 y 中得到一个函数,它是 536 个函数的总和。我尝试这样做的语法是:

sum=@(y)(s(v(1),y,z2(1))); 
for i=2:536 
  sum=@(y)(sum+s(v(i),y,z2(i))) 
end

【问题讨论】:

  • 我真的对Matlab一无所知,但你试过写y3=@(x)( y1(x) + y2(x) )吗?
  • 非递归解决方案:mySum = @(y) sum( s(v,y,z) ); 变量 vz 在函数定义范围内,函数 sum 由 MATLAB mathworks.com/help/techdoc/ref/sum.html 定义
  • 如果您发现自己需要像这样对函数句柄求和,可能有更好的处理方式。

标签: function math matlab


【解决方案1】:

Fyodor Soikin 提出的解决方案是可行的。

>> y3=@(x)(y1(x) + y2(x))
y3 =
@(x) (y1 (x) + y2 (x))

如果您想在多个函数上执行此操作,您可以使用中间变量:

>> f1 = y1;
>> f2 = y2;
>> y3=@(x)(f1(x) + f2(x))

评论后编辑: 我不确定是否理解问题。你能像函数外那样定义你的向量 v 和 w 吗:

v = [5 4]; % your 536 data
w = [4 5];
y = 8;
s=@(y)((1-exp(-v*y)-w).*exp(-v*y))
s_sum = sum(s(y))

注意乘法中的点以逐元素进行。

【讨论】:

  • 非常感谢您的帮助,这确实有效,但我无法将其概括为一个循环并遇到问题。我有函数 s=@(x,y,z)((1-exp(-xy)-z)*exp(-xy));我有一个包含 536 个数据点的向量 v 和另一个也包含 536 个数据点的向量 w。我的目标是总结 s(v(i),y,w(i)) for i=1...536 从而在变量 y 中得到一个函数,它是 536 个函数的总和。为了做到这一点,我尝试使用的语法是: sum=@(y)(s(v(1),y,z2(1))); for i=2:536 sum=@(y)(sum+s(v(i),y,z2(i))) 结束
【解决方案2】:

我认为 Mikhail 的评论中给出了最简洁的解决方案。我会更详细地充实它...

首先,您需要修改您的anonymous functions,以便它可以使用element-wise arithmetic operators 对相同大小的向量输入和标量输入 (as suggested by Clement J.) 进行操作,如下所示:

s = @(x,y,z) (1-exp(-x.*y)-z).*exp(-x.*y);  %# Note the periods

然后,假设您在给定的工作空间中定义了向量 vw,您可以创建一个新函数 sy,对于给定的标量值 y,它将与 s 相加对vw 中的每组值进行评估:

sy = @(y) sum(s(v,y,w));

如果您想使用 y 的值数组来评估此函数,您可以像这样添加对函数 ARRAYFUN 的调用:

sy = @(y) arrayfun(@(yi) sum(s(v,yi,w)),y);

请注意,vw 将在函数 sy 中使用的值将是 fixed to what they were when the function was created。换句话说,改变工作空间中的vw 不会改变sy 使用的值。另请注意,我没有将新的匿名函数命名为 sum,因为已经有 a built-in function with that name

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多