我目前正在使用MATLAB编写模拟代码,并且需要一些关于我一直遇到的问题的帮助。
我正在处理一个问题,我有n
个单独的匿名函数句柄f_i
,每个句柄存储在单元格数组functions
中并接受1x1数字数组{{1并返回1x1数字数组x_i
。
我正在尝试将这些匿名函数句柄中的每一个组合成一个匿名函数句柄,该句柄接受单个y_i
x n
数值数组1
并返回单X
} x n
- 数字数组1
。在此,Y
,X(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}
,n
和f_1
的代码来构造一个输入和输出f_2
数字数组的函数句柄F. / p>
2x1
答案 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来解决,尽管在如何格式化输入参数方面会有一些差异。您可以使用函数CELLFUN和FEVAL在一行中评估您的匿名函数,并使用函数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
已用于内置函数FUNCTIONS。 colon 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