MATLAB:合并函数句柄

时间:2011-01-25 08:12:00

标签: matlab

我目前正在使用MATLAB编写模拟代码,并且需要一些关于我一直遇到的问题的帮助。

我正在处理一个问题,我有n个单独的匿名函数句柄f_i,每个句柄存储在单元格数组functions中并接受1x1数字数组{{1并返回1x1数字数组x_i

我正在尝试将这些匿名函数句柄中的每一个组合成一个匿名函数句柄,该句柄接受单个y_i x n数值数组1并返回单X } x n - 数字数组1。在此,YX(i) = x_i

作为示例,让Y(i) = y_i = f_i(x_i)和f_1和f_2是输入和输出n = 2数组的两个函数句柄,并存储在名为functions

的单元数组中
1x1

我基本上需要能够使用f_1 = @(x_1) x_1^2 f_2 = @(x_2) x_2^3 functions = {f_1,f_2} nf_1的代码来构造一个输入和输出f_2数字数组的函数句柄F. / p>

2x1

3 个答案:

答案 0 :(得分:5)

使用内联@() - 匿名语法来定义这样的函数很困难(因为函数体的要求受限于表达式)。仍然可以定义一个普通(非匿名)函数,该函数在给定向量的项目上运行,并将给定单元格数组中的函数应用于这些项目。

function y = apply_funcs(f, x)
    assert(length(f) == length(x));
    y = x;
    for i = 1 : length(f)
        y(i) = feval(f{i}, x(i));
    end 
end

每次需要将此函数传递给其他函数时,只需引用其@ - 句柄。

F = @apply_funcs

答案 1 :(得分:2)

这可以使用a solution I provided to a similar previous question来解决,尽管在如何格式化输入参数方面会有一些差异。您可以使用函数CELLFUNFEVAL在一行中评估您的匿名函数,并使用函数NUM2CELL将输入向量转换为要由CELLFUN

f_1 = @(x_1) x_1^2;     %# First anonymous function
f_2 = @(x_2) x_2^3;     %# Second anonymous function
fcnArray = {f_1; f_2};  %# Cell array of function handles
F = @(x) cellfun(@feval,fcnArray(:),num2cell(x(:)));

请注意,我使用名称fcnArray作为函数句柄的单元格数组,因为名称functions已用于内置函数FUNCTIONScolon operator (:)用于将fcnArray和输入参数x转换为列向量(如果它们尚未存在)。这可确保输出为列向量。

以下是一些测试用例:

>> F([2;2])

ans =

     4
     8

>> F([1;3])

ans =

     1
    27

答案 2 :(得分:1)

#you can try 
f=@(x)[x(1)^2;x(2)^3]
>>f([1,2])
ans =
     1
     8
>>f([2,3])
ans =
     4
    27