【问题标题】:Dynamically generate function for use in function handle动态生成用于函数句柄的函数
【发布时间】:2014-09-08 22:42:02
【问题描述】:

我想动态构造一个函数,然后可以用函数句柄引用该函数,以供以后在 Matlab 函数中使用,例如积分(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) )

返回错误。

【问题讨论】:

    标签: matlab function-handle


    【解决方案1】:

    这不是真的

    函数句柄期望 'x' 是一个标量

    问题不在于函数句柄,也不在于函数是anoymous。问题只是你用来定义那个函数的操作:你做不到

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

    xK 都是任意大小的向量时。附带说明一下,分母中缺少一对括号。

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

    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
    

    【讨论】:

    • 谢谢,按预期工作!当您说“当 x 和 K 都是具有任意大小的向量时”时,您的意思是当声明 'fun' 时,它需要在执行时知道向量的大小?我假设 'bsxfun' 没有这个限制,我们基本上将任意大小的东西“包装”在里面。
    • @Joshbevan 我的意思是,例如,在计算 x - K(1:3) 时,xK(1:3) 的大小应该匹配,否则操作未定义。但即使它们匹配,你也不想减去x - K(1:3)(元素方面)。您想从x 的每个元素中减去K(1:3) 的每个元素,即所有组合。这就是bsxfun 在向量具有不同方向时所做的事情(一个是列向量,另一个是行向量)
    猜你喜欢
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多