为 matlab 匿名函数设置 'help'
set 'help' for matlab anonymous functions
我有一个很长的匿名函数,我想知道是否可以(轻松)修改帮助输出:
>> myfunc=@(x) x; %example anonymous function
>> help myfunc
myfunc is a variable of type function_handle.
我知道长匿名函数可能是一件相当不寻常的事情 - 尽管如此:只要函数句柄存在,这是否可以通过未记录的函数实现?
编辑:评论者要求一个用例:我阅读了具有多个输出(此处Lorem on the art of matlab)的匿名函数,例如
fmeanVar = @(x) deal(mean(x), var(x));
%a long example function to split a cell array containing 3D matrices into two cell arrays
myfunc=@(x,c) deal(cellfun(@(d) d(:,:,1:c:end),x),cellfun(@(d) d(:,:,setxor(1:c:end,1:end)),x));
我想确保我记得第二个输出参数是什么,稍后,你知道...因为人类忘记了东西
根据 help
的 Matlab 文档,这是不可能的:
help name displays the help text for the functionality specified by name, such as a function, method, class, toolbox, or variable.
不是句柄也不是符号。
问题是当您调用 help
时它会重新读取文件。使用
创建匿名函数时
f = @(x) x %Sample text
然后它会忽略 %Sample text
并因此消失。一种解决方案是将它变成一个结构,其中一个字段是函数,另一个是帮助。例如。像
fMeanVar.fct = @(x) [mean(x), var(x)];
fMeanVar.help = "Second output is the variance"
因此当你想使用你调用的函数时
fMeanVar.fct([1,2,3,4])
如果您忘记了用法,只需调用
fMeanVar.help
您可以创建自己的匿名函数处理 class 来模拟此功能,仅隐藏此对象类型的 help
函数。
我在下面写了 class,但首先会显示用法,它只需要在你的路径上有 class 并稍微调整你声明匿名函数的方式:
我们也可以为此 class 类型覆盖 subsref
函数,然后您可以使用 ()
语法直接调用函数句柄,而不是按照建议索引到结构中 .
请注意,您必须传递句柄,而不是函数名称(即 help(f)
或 f.help
,而不是 help f
或 help('f')
)。您必须完全隐藏 help
函数才能绕过此限制,我不会真正赞同!
用法
>> f = anon( @() disp( 'Hi!' ), 'This function displays "Hi!"' );
>> help( f )
Input is a value of type function_handle.
This function displays "Hi!"
>> f()
Hi!
>> f = anon( @(x) x + 10, 'Adds 10 to the input' );
>> help( f )
Input is a value of type function_handle.
Adds 10 to the input
>> f(15:17)
ans =
[ 25, 26, 27 ]
>> f.func = @(x) x + 15;
>> f.helpStr = 'Adds 15 to the input'
>> f(15:17)
ans =
[ 30 31 32 ]
如果未指定,则保留默认函数句柄 help
>> f = anon( @(x) x + 10 );
>> help( f )
Input is a value of type function_handle.
Class代码
class 可以使用一些额外的输入检查等,但原则上是可行的!
classdef anon < handle
properties ( Access = public )
helpStr % String to display on help( obj )
func % Function handle (meant for anonymouse functions
end
methods
function obj = anon( func, helpStr )
assert( isa( func, 'function_handle' ) ); % Input check
obj.func = func;
if nargin > 1
obj.helpStr = helpStr; % Set help string
end
end
function help( obj )
h = help( obj.func ); % Normal behaviour.
if ~isempty( obj.helpStr )
% Custom string (does nothing if empty)
fprintf( '%s%s\n', h, obj.helpStr );
else
disp( h );
end
end
function varargout = subsref( obj, s )
% Need to override the subsref behaviour to enable default
% function calling behaviour!
switch s(1).type
case '()'
[varargout{1:nargout}] = obj.func( s(1).subs{:} );
otherwise
[varargout{1:nargout}] = builtin('subsref', obj, s);
end
end
end
end
我有一个很长的匿名函数,我想知道是否可以(轻松)修改帮助输出:
>> myfunc=@(x) x; %example anonymous function
>> help myfunc
myfunc is a variable of type function_handle.
我知道长匿名函数可能是一件相当不寻常的事情 - 尽管如此:只要函数句柄存在,这是否可以通过未记录的函数实现?
编辑:评论者要求一个用例:我阅读了具有多个输出(此处Lorem on the art of matlab)的匿名函数,例如
fmeanVar = @(x) deal(mean(x), var(x));
%a long example function to split a cell array containing 3D matrices into two cell arrays
myfunc=@(x,c) deal(cellfun(@(d) d(:,:,1:c:end),x),cellfun(@(d) d(:,:,setxor(1:c:end,1:end)),x));
我想确保我记得第二个输出参数是什么,稍后,你知道...因为人类忘记了东西
根据 help
的 Matlab 文档,这是不可能的:
help name displays the help text for the functionality specified by name, such as a function, method, class, toolbox, or variable.
不是句柄也不是符号。
问题是当您调用 help
时它会重新读取文件。使用
f = @(x) x %Sample text
然后它会忽略 %Sample text
并因此消失。一种解决方案是将它变成一个结构,其中一个字段是函数,另一个是帮助。例如。像
fMeanVar.fct = @(x) [mean(x), var(x)];
fMeanVar.help = "Second output is the variance"
因此当你想使用你调用的函数时
fMeanVar.fct([1,2,3,4])
如果您忘记了用法,只需调用
fMeanVar.help
您可以创建自己的匿名函数处理 class 来模拟此功能,仅隐藏此对象类型的 help
函数。
我在下面写了 class,但首先会显示用法,它只需要在你的路径上有 class 并稍微调整你声明匿名函数的方式:
我们也可以为此 class 类型覆盖 subsref
函数,然后您可以使用 ()
语法直接调用函数句柄,而不是按照建议索引到结构中
请注意,您必须传递句柄,而不是函数名称(即 help(f)
或 f.help
,而不是 help f
或 help('f')
)。您必须完全隐藏 help
函数才能绕过此限制,我不会真正赞同!
用法
>> f = anon( @() disp( 'Hi!' ), 'This function displays "Hi!"' );
>> help( f )
Input is a value of type function_handle.
This function displays "Hi!"
>> f()
Hi!
>> f = anon( @(x) x + 10, 'Adds 10 to the input' );
>> help( f )
Input is a value of type function_handle.
Adds 10 to the input
>> f(15:17)
ans =
[ 25, 26, 27 ]
>> f.func = @(x) x + 15;
>> f.helpStr = 'Adds 15 to the input'
>> f(15:17)
ans =
[ 30 31 32 ]
如果未指定,则保留默认函数句柄 help
>> f = anon( @(x) x + 10 );
>> help( f )
Input is a value of type function_handle.
Class代码
class 可以使用一些额外的输入检查等,但原则上是可行的!
classdef anon < handle
properties ( Access = public )
helpStr % String to display on help( obj )
func % Function handle (meant for anonymouse functions
end
methods
function obj = anon( func, helpStr )
assert( isa( func, 'function_handle' ) ); % Input check
obj.func = func;
if nargin > 1
obj.helpStr = helpStr; % Set help string
end
end
function help( obj )
h = help( obj.func ); % Normal behaviour.
if ~isempty( obj.helpStr )
% Custom string (does nothing if empty)
fprintf( '%s%s\n', h, obj.helpStr );
else
disp( h );
end
end
function varargout = subsref( obj, s )
% Need to override the subsref behaviour to enable default
% function calling behaviour!
switch s(1).type
case '()'
[varargout{1:nargout}] = obj.func( s(1).subs{:} );
otherwise
[varargout{1:nargout}] = builtin('subsref', obj, s);
end
end
end
end