6

我有一个很长的匿名函数,我想知道是否可以(轻松地)修改帮助输出:

>> myfunc=@(x) x; %example anonymous function
>> help myfunc
myfunc is a variable of type function_handle.

我知道长匿名函数可能是一件相当不寻常的事情——尽管如此:只要函数句柄存在,这是否可以通过未记录的函数来实现?

编辑:评论者要求一个用例:我阅读了具有多个输出的匿名函数(这里是关于 matlab 艺术的 Lorem),例如

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));

而且我想确保我记得第二个输出参数是什么,稍后,你知道......因为人类忘记了东西

4

3 回答 3

6

您可以创建自己的匿名函数处理类来模仿此功能,help仅隐藏此对象类型的函数。

我已经编写了下面的类,但将首先显示用法,它只需要在您的路径上放置该类并稍微调整您声明匿名函数的方式:

我们也可以覆盖subsref此类类型的函数,然后您可以使用()语法直接调用函数句柄,而不是像Nicky 的回答所建议的那样对结构进行索引。

请注意,您必须传入句柄,而不是函数名(即help(f)or f.help,not help for 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.

班级代码

该类可以使用一些额外的输入检查等,但原则上有效!

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
于 2018-12-10T16:29:24.943 回答
6

问题是当您调用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
于 2018-12-10T14:22:31.940 回答
2

根据 Matlab 文档help,这是不可能的:

help name 显示由名称指定的功能的帮助文本,例如函数、方法、类、工具箱或变量。

不是为了句柄,也不是象征性的。

于 2018-12-10T14:17:15.160 回答