如何从函数句柄中获取函数的子集,该函数句柄是Matlab

时间:2016-03-29 08:48:39

标签: matlab function indexing handle

在Matlab中,我有一个函数句柄,被定义为像这样的向量

F = @(x) [... 
coeff1*x(1)*x(4); ...
coeff2*x(3); ... 
coeff3*x(7)*x(3) ...
];

实际上它有150行。我需要提取行中函数的不同子集。例如,从3:17中的行F创建一个新句柄。但我不能只为索引编制索引。有解决方案吗?

编辑:我需要将子集作为新句柄,换句话说,我无法评估整个F并只选择解决方案行。

提前致谢。

3 个答案:

答案 0 :(得分:3)

创建它有点麻烦,但是有一个函数句柄向量而不是创建向量的函数句柄可能更有意义:

F = {... 
     @(x)coeff1*x(1)*x(4); ...
     @(x)coeff2*x(3); ... 
     @(x)coeff3*x(7)*x(3) ...
    };

现在你可以打电话了

cellfun(@(x)x(y),F(3:17))

甚至

F2 = @(y)cellfun(@(x)x(y),F(3:17))

现在你可以打电话了

y = rand(10,1)
F2(y)

只返回原始3的{​​{1}}行到17。这基本上只是简单地包装循环。您需要确保输入F的大小合适,否则您会收到错误(即如果yy并且您的第三行尝试拨打[1,2]您将得到错误)

答案 1 :(得分:2)

您可以将原始功能转换为Dan答案中使用的格式:

>> G=regexp(func2str(F), ';|\[|\]', 'split')
G = 
    '@(x)'    'coeff1*x(1)*x(4)'    'coeff2*x(3)'    'coeff3*x(7)*x(3)'    ''
>> H=cellfun(@str2func, strcat(G{1}, G(2:end-1)), 'uni', 0)
H = 
    @(x)coeff1*x(1)*x(4)    @(x)coeff2*x(3)    @(x)coeff3*x(7)*x(3)

现在H是一个包含函数句柄的单元格数组,您可以将其编入索引。

答案 2 :(得分:1)

这个怎么样:

F = @(x)[
     5*x.^2*x*4;
     6*x; 
     12*x.^2*x*3
    ];

newF = getFunHandles(F,2:3);

其中getFunHandles适用于任意范围,例如3:17

function f = getFunHandles(F, range)
funStr = textscan(func2str(F),'%s','delimiter',';');
funStr = regexprep(funStr{1}, {'@(x)[', ']'}, {'', ''});
newFunStr = strcat('@(x)[',strjoin(funStr(range),';'),']');
f = str2func(newFunStr);