How to convert a cell array containing various inline functions to a unique inline function?

3 visualizaciones (últimos 30 días)
I need to use the fminimax function and the input has to be necessarily a single inline function. But I need several equations in this function. And I'm going to add them one by one through a for loop in a cell.
I need to convert this:
cell =
1×3 cell array
{@(x)(a(1,1)-x)^2} {@(x)(a(2,2)-x)^2} {@(x)(a(3,3)-x)^2}
For this:
func =
function_handle with value:
@(x)[(a(1,1)-x)^2;(a(2,2)-x)^2;(a(3,3)-x)^2]

Respuesta aceptada

Stephen23
Stephen23 el 5 de Jun. de 2019
Editada: Stephen23 el 5 de Jun. de 2019
You could hide the loop inside cellfun:
>> a = rand(3,3);
>> C = {@(x)(a(1,1)-x)^2,@(x)(a(2,2)-x)^2,@(x)(a(3,3)-x)^2};
>> F = @(x)cellfun(@(f)f(x),C(:));
>> F(1.2)
ans =
0.40767
0.39542
1.26850

Más respuestas (1)

TADA
TADA el 5 de Jun. de 2019
Editada: TADA el 5 de Jun. de 2019
You can generate a function handle which will execute all the handles in a cell array using closures:
a = magic(3);
myFunctions = [{@(x)(a(1,1)-x)^2} {@(x)(a(2,2)-x)^2} {@(x)(a(3,3)-x)^2}];
aggregatedFunctionHandle = genFunHandle(myFunctions);
disp(aggregatedFunctionHandle(10));
function foo = genFunHandle(handles)
function y = func(x)
y = cellfun(@(fh) fh(x), reshape(handles, numel(handles), 1));
end
foo = @func;
end
output:
6724
4900
6084
but if your functions are always of that format: @(x)(a(i,i)-x)^2
do this instead:
f = @(x) (diag(a)-x).^2
  1 comentario
TADA
TADA el 5 de Jun. de 2019
also possible with an inline closure like that:
a = magic(3);
myFunctions = [{@(x)(a(1,1)-x)^2} {@(x)(a(2,2)-x)^2} {@(x)(a(3,3)-x)^2}];
aggregatedFunctionHandle =...
@(x) cellfun(@(fh) fh(x), reshape(myFunctions, numel(myFunctions), 1));

Iniciar sesión para comentar.

Categorías

Más información sobre Function Creation en Help Center y File Exchange.

Productos


Versión

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by