How can I implement an array of function handles that takes a struct as input and calculates the function value for each function handle?
    8 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Carolin Katzschke
 el 2 de Jun. de 2015
  
    
    
    
    
    Comentada: Carolin Katzschke
 el 2 de Jun. de 2015
            I have function handles, e.g. area_rectangle and area_circle, and structs that contain information like input_variables.height = 3.
function area_rectangle = area_rectangle(input_variables, constants)
    if ~isfield(input_variables,'height') || ~isfield(input_variables,'width') 
        area_rectangle = NaN;
    else    
        area_rectangle = input_variables.width * input_variables.height;
    end
function area_circle = area_circle(input_variables, constants)
      if ~isfield(input_variables,'radius') || ~isfield(constants,'pi') 
          area_circle = NaN;
      else    
          area_circle = constants.pi * input_variables.radius^2;
      end
Unfortunately, cell arrays can't be used because they need some kind of index support:
     >> test = cell(2,1)
        test = 
            []
            []
      >> test{1}=@area_rectangle;
      >> test{2}=@area_circle;
      >> test
      test = 
          @area_rectangle
          @area_circle
      >> input_variables = struct('height',3,'width',2,'radius',1)
    input_variables = 
        height: 3
         width: 2
        radius: 1
  >> constants = struct('pi',3.14159)
constants = 
      pi: 3.1416
  >> test(input_variables,constants)
    Error using subsindex
    Function 'subsindex' is not defined for values of class 'struct'
How can I use function handles and structs at the same time?
Thanks in advance.
0 comentarios
Respuesta aceptada
  Jan Orwat
      
 el 2 de Jun. de 2015
        Hello Carolin, you can evaluate functions in a loop:
>> values = zeros(1,length(test));
>> for k = 1:length(test)
       values(k) = test{k}(input_variables,constants);
   end
>> values
values =
    6.0000    3.1416
or using cellfun():
>> values = cellfun(@(F)F(input_variables,constants),test)
values =
    6.0000    3.1416
cellfun looks more compact, but it is often harder to read and modify, especially when you are going back to the piece of code after a while.
Más respuestas (0)
Ver también
Categorías
				Más información sobre Interactive Control and Callbacks en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!