# find all anonymous function in a workspace

1 次查看（过去 30 天）
Leo Simon 2021-12-17

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 个评论显示 1更早的评论隐藏 1更早的评论
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 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 个评论显示 5更早的评论隐藏 5更早的评论
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 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 个评论显示 1更早的评论隐藏 1更早的评论
Voss 2021-12-17
That's a good point.

### 类别

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

### Community Treasure Hunt

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

Start Hunting!