find all anonymous function in a workspace

1 次查看(过去 30 天)
There surely has to be a way of doing this: finding all anonymous functions in a specified workspace.
Presumably the solution involves using `whos` but I can't find it on web.
For a specific example suppose my workspace has the following variables
f = @x) x^2 ;
g = @(z,y) x^3 + z;
a = rand(5,3);
b = a^3 + 5;
I want a command that will identify (and return) f and g. A bonus would be for the command to list the arguments of f and g, but I can live without that.
Thanks for any suggestions.
  2 个评论
Leo Simon
Leo Simon 2021-12-17
In poorly written code, I have many anonymous functions; in some, the only arguments are endogenous variables; in others the arguments include parameters in addition. E.g.,
f = @(x,y) a*x + b*y
g = @(x,y,a,b) a*x +b*y
I obviously don't want two functions that are intended to do the same thing, so I'm going to rewrite f as below, but first I need to find all the duplicates. Applying func2str to the elements of @Benjamin 's and @Walter Roberson answer should do the trick!
f = @(x,y) g(x,y,a,b)

请先登录,再进行评论。

采纳的回答

Walter Roberson
Walter Roberson 2021-12-17
Borrowing heavily from @Benjamin
f = @(x) x^2 ;
g = @(z,y) y^3 + z;
h = @sin; % This is NOT an anonymous function!!!!
a = rand(5,3);
b = a.^3 + 5;
S = whos();
names = {S.name};
classes = {S.class};
function_handle_names = names(strcmp(classes,'function_handle'))
info = cellfun(@(S) functions(evalin('caller', S)), function_handle_names, 'uniform', 0);
issimple = strcmp(cellfun(@(S)S.type, info, 'uniform', 0), 'simple');
anonymous_functions = function_handle_names(~issimple)
  6 个评论
Leo Simon
Leo Simon 2021-12-17
Ugh, sorry, it was in my startup script, shouidl have checked that. It's instructive though. I guess the pure way to be sure would be to run the info command before and after running the program, then do a setdiff to find the added anon functions.

请先登录,再进行评论。

更多回答(1 个)

Voss
Voss 2021-12-17
% set up some variables in the workspace:
f = @(x) x^2 ;
g = @(z,y) y^3 + z;
a = rand(5,3);
b = a.^3 + 5;
S = whos();
names = {S.name};
classes = {S.class};
function_handle_names = names(strcmp(classes,'function_handle'));
display(function_handle_names);
function_handle_names = 1×2 cell array
{'f'} {'g'}
  2 个评论

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Whos 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by