动态生成函数句柄中使用的函数

时间:2014-09-08 22:42:02

标签: matlab function-handle

我想动态构造一个函数,然后可以使用函数句柄引用该函数,以便稍后在Matlab函数中使用,例如integral(fun,a,b)。

作为一个例子,想象一个带有术语的函数:

(x-A)/(D-A) * (x-B)/(D-B) * (x-C)/(D-C)

其中x是变量,A,B,C,D是来自不同函数生成的向量(称为K = [A,B,C,D]')的常量。

我能做到:

fun = @(x) (x-A)/(D-A) * (x-B)/(D-B) * (x-C)/(D-C)

但是,这限制了我三个学期。我希望能够采用任意长度的常量向量,并生成与上面相似的形式的函数。 通常这在Matlab中很容易,但似乎函数句柄期望'x'是标量,所以类似于:

prod( (x - K(1:3)) ./ K(4)-K(1:3) )

返回错误。

1 个答案:

答案 0 :(得分:1)

并非如此
  

功能处理期望' x'成为标量

问题不在于函数句柄,也不在于函数anoymous。问题只是您用来定义该功能的操作:您不能

  

prod( (x - K(1:3)) ./ K(4)-K(1:3) )

xK都是具有任意大小的向量时。作为旁注,分母中缺少一对括号。

你想要的(如果我理解正确的话)可以使用bsxfun两次完成。假设xK都是向量,请使用

prod(bsxfun(@rdivide, bsxfun(@minus, x.', K(1:end-1)), K(end)-K(1:end-1)))

计算你的功能。

所以:首先定义K,然后你可以将匿名函数及其句柄定义为

fun = @(x) prod(bsxfun(@rdivide,bsxfun(@minus,x.',K(1:end-1)),K(end)-K(1:end-1)))

请注意K的值为"硬连线"在定义后者时进入匿名函数。如果您稍后修改K,该功能将不会更改(除非您使用新的K再次定义该功能)。

示例:

>> K = [3 4 5 6].';
>> fun = @(x)prod(bsxfun(@rdivide,bsxfun(@minus,x.',K(1:end-1)),K(end)-K(1:end-1)));
>> x = [1 2].';
>> fun(x)
ans =
    -4    -1

检查:

>> prod( (x(1) - K(1:3)) ./ (K(4)-K(1:3)) )
ans =
    -4

>> prod( (x(2) - K(1:3)) ./ (K(4)-K(1:3)) )
ans =
    -1