我想动态构造一个函数,然后可以使用函数句柄引用该函数,以便稍后在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) )
返回错误。
答案 0 :(得分:1)
并非如此
功能处理期望' x'成为标量
问题不在于函数句柄,也不在于函数anoymous。问题只是您用来定义该功能的操作:您不能
prod( (x - K(1:3)) ./ K(4)-K(1:3) )
当x
和K
都是具有任意大小的向量时。作为旁注,分母中缺少一对括号。
你想要的(如果我理解正确的话)可以使用bsxfun
两次完成。假设x
和K
都是列向量,请使用
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