我希望能够构建函数的笛卡尔积。例如,考虑遵循两组函数
a = function_handle1;
b = function_handle2;
c = function_handle3;
d = function_handle4;
result = cartprod({a b}, {c d});
result
应该是这样的:
result = [a c; a d; b c; b d];
MATLAB中有什么东西允许我这样做吗?
答案 0 :(得分:3)
MATLAB中笛卡尔积的转换函数是ndgrid
(或meshgrid
)。在这种情况下,诀窍是将句柄打包到单元格数组中并使用meshgrid
中的索引执行操作。例如,
>> a=@sum; b=@mean; c=@std; d=@var;
>> handles = {a,b,c,d}
handles =
@sum @mean @std @var
现在句柄存储在单元格数组中,您可以通过索引来构建输出数组:
>> [II,JJ]=meshgrid(1:2,3:4);
>> result=handles([II(:) JJ(:)])
result =
@sum @std
@sum @var
@mean @std
@mean @var
请记住,您需要使用花括号({}
)来访问单元格的内容:
>> x = [1 2];
>> result{1,1}(x)
ans =
3
>> result{1,2}(x)
ans =
0.7071
>> result{2,2}(x)
ans =
0.5000
或者您可以使用cellfun
:
>> x = [1 2];
>> cellfun(@(c)c(x),result(1,:))
ans =
3.0000 0.7071
请注意,您不能拥有常规的函数句柄数组。如果您尝试任何形式的连接(例如horzcat
,vertcat
,cat
),则会收到错误Nonscalar arrays of function handles are not allowed; use cell arrays instead.
。也可以将句柄分配给struct
数组的字段,并使用function_handle
documentation中所示的structfun
。