函数句柄的笛卡尔积

时间:2013-12-16 04:33:06

标签: matlab function

我希望能够构建函数的笛卡尔积。例如,考虑遵循两组函数

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中有什么东西允许我这样做吗?

1 个答案:

答案 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

请注意,您不能拥有常规的函数句柄数组。如果您尝试任何形式的连接(例如horzcatvertcatcat),则会收到错误Nonscalar arrays of function handles are not allowed; use cell arrays instead.。也可以将句柄分配给struct数组的字段,并使用function_handle documentation中所示的structfun