2011-01-25 104 views
5

我目前正在MATLAB中编写一个模拟程序,需要一些帮助来解决我遇到的问题。MATLAB:合并函数句柄

我正在哪里有n单独的匿名函数处理f_i,其中的每一个被存储在单元阵列functions并接受一个1x1数字数组x_i并返回一个1x1的数值数组y_i的问题。

我想这些匿名函数的结合处理成接受单个n X 1数值数组X并返回单一n X 1 -numeric阵列Y一个匿名函数处理。这里,X(i) = x_iY(i) = y_i = f_i(x_i)

作为例子,让n = 2和F_1和F_2是两个函数处理输入和输出1x1阵列和被存储在一个单元阵列命名的功能

f_1 = @(x_1) x_1^2 
f_2 = @(x_2) x_2^3 
functions = {f_1,f_2} 

我基本上需要代码,将能够使用n,f_1f_2来构造输入和输出数字数组的数组函数句柄F.

F = @(x) [f_1(x(1,1));f_2(x(2,1))] 

回答

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 
+0

感谢这个! 我需要尽可能高效的代码,所以我可能会使用你的函数并删除长度/断言参数... 另外,你会知道feval是否比使用内联函数句柄评估更快?也就是说,如果y(i)= f {i}(x(i))比y(i)= feval(f {i},x(i))快> – 2011-01-25 19:59:50

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 
+0

再次感谢您。你的方法肯定更加简洁,但我想知道它是否会比ib描述的for循环更快。 – 2011-01-25 19:47:29

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