在Matlab的命令窗口中获取旧式帮助

时间:2015-03-09 23:33:49

标签: matlab

问题的简短版本

在Matlab的最新版本中(我已在Windows上的R2014b和R2015a中看到它),当您键入help foo时,您会获得该函数及其签名的简要说明。例如,键入help bsxfun会产生类似这样的内容(仅使用更好的格式):

  

此MATLAB函数将函数句柄fun指定的逐元素二元运算应用于数组AB,并启用单例扩展。

C = bsxfun(fun,A,B)
     

bsxfun

的参考页面      

另请参阅arrayfunrepmat

     

bsxfun的其他用途          distcomp/bsxfun

这当然只是实际文档的摘要。要获取完整文档,您需要输入doc foo。这将打开HTML帮助浏览器,这需要相当长的时间(至少在某些计算机上)。

有没有办法在命令窗口中获得完整的帮助(从而避免使用帮助浏览器),因为它曾经是旧的Matlab版本?

长版问题

为了更详细地研究这个问题,我将“旧的”Matlab版本定义为没有HTML帮助的版本,将“新”版本定义为那些版本。我还需要为每种类型的帮助命名,以便引用它们:

  • FP (Full,Plain):纯文本形式的完整帮助,在Matlab命令窗口(旧样式)中显示。

  • SH (摘要,HTML):以HTML格式汇总帮助,在Matlab命令窗口中显示。

  • FH (完整,HTML):HTML格式的完整帮助,显示在帮助浏览器中。

众所周知,FP帮助的文本包含在定义函数的文件中的第一个注释行中。在新的Matlab版本中,函数也可能具有关联的HTML文件。此文件包含HTML标记中的SH帮助和HTML代码中的FH帮助。

可能的行为是:

  • 在旧的Matlab版本中,help foo生成了FP帮助。
  • 在新的Matlab版本中,如果help foo有关联的HTML帮助文件,foo会生成SH帮助,如果没有,则会生成FP帮助。
  • 在新的Matlab版本中,如果doc foo具有关联的HTML帮助文件,则foo会生成FH帮助。如果没有,FP帮助将显示在帮助浏览器中(无格式)。

因此问题更恰当地表达为:foo具有关联的HTML帮助文件时,如何在新的Matlab版本中显示FP帮助。这个问题很有意义,因为

  • 大多数Matlab函数都有关联的HTML帮助文件。
  • 大多数Matlab函数,甚至是内置函数(没有m代码),都有包含FP帮助的m文件。

另一个动机是,在某些情况下,FP文档包含未出现在FH文档中的功能(请参阅例如here)。

2 个答案:

答案 0 :(得分:7)

原始答案(Matlab版本R2014b,R2015a)

虽然文档没有说明,但这些Matlab版本中的help函数支持零个,一个或两个输出参数。您可以检查此键入open help并查看函数签名:

function [out, docTopic] = help(varargin)

实质上,help内部工作如下:

  1. 它通过调用类构造函数创建一个名为process的类helpUtils.helpProcess的对象:

    process = helpUtils.helpProcess(nargout, nargin, varargin);
    

    nargoutarginvararginhelp被调用的地方。

  2. 它运行方法process.getHelpText,该方法调用未记录的内置函数helpfunc,并作为结果设置属性process.helpStr。此属性包含命令窗口中显示的帮助字符串。

  3. 事实证明,至少在Windows上,取决于nargout 的值(传递给构造函数helpUtils.helpProcess生成的帮助字符串将是FP或SH 。也就是说,如果nargout>0则为FP,如果为nargout==0,则为SH。您可以通过在命令窗口中直接键入以下代码(从help.m改编)来检查:

    process = helpUtils.helpProcess(1, 1, {'bsxfun'});
    process.getHelpText
    process.helpStr
    

    这将产生FP帮助。另一方面,将第一个1(对应于实际通话中的nargout)更改为0

    process = helpUtils.helpProcess(0, 1, {'bsxfun'});
    process.getHelpText
    process.helpStr
    

    将产生SH帮助。

    我不知道为什么会这样,也就是说,它的工作方式比这更深层次。我所知道的是getHelp方法调用了未记录的helpfunc,它至少涉及生成FP帮助。

    所以,要获得FP帮助,您需要使用一个或两个输出参数调用help 。例如,

    str = help('foo')
    

    将FP帮助文本分配给变量str并显示它。或者你可以使用

    disp(help('foo'))
    

    也具有使用(隐式)输出参数调用help的效果。

    要从标准命令help foo 中获得此行为,您可以将help函数定义为覆盖Matlab的help ,并将其放在Matlab文档文件夹中。此文件夹通常首先出现在路径中(或者您可以通过编辑startup.m来确保它),因此具有优先权。新函数实际上将使用一个输出参数调用Matlab的help,然后显示生成的(FP)帮助文本。要调用overriden函数,必须暂时更改为其文件夹:

    function help(varargin)
    if isempty(varargin)
        varargin = {'help'}; %// `help` should be equivalent to `help help`
    end
    d = pwd; %// take note of current folder
    cd(fullfile(matlabroot, 'toolbox', 'matlab', 'helptools')) %// folder where the
        %// standard `help` function is
    disp(help(varargin{1}));
    cd(d) %// restore folder
    

    现在,最后,help foo生成旧式(FP)帮助。

    编辑Matlab版本R2015b

    在Matlab R2015b中,行为似乎已经改善了。键入help foo不再产生SH帮助。它也不完全是FP。实际上它比这更好:它产生FH帮助但是在命令窗口中,而不是在浏览器中。或者,等效地,它产生FP帮助,但有链接和更好的格式化。

    所以不再需要调整了!

    编辑Matlab版本R2018a

    Matlab R2018a再次给SH帮忙。此答案中提供的解决方案有效(即产生FP帮助)。

    回到调整!

答案 1 :(得分:4)

更好的方法是在使用help命令时包含该函数的完整路径,然后显示旧样式完整帮助,链接也可用,例如尝试:

help surf
help(fullfile(matlabroot, 'toolbox', 'matlab', 'graph3d', 'surf.m'))

我刚刚将基于此的覆盖 help函数提交给MATLAB FEX:Full Command Line Help