【问题标题】:Matlab Command Window Output Source [duplicate]Matlab命令行窗口输出源[重复]
【发布时间】:2012-06-05 00:23:43
【问题描述】:

可能重复:
Find location of current m-file in Matlab

有谁知道如何在 Maltab 中找到向命令窗口提供输出的函数?我编写了一个包含许多函数的代码,我已经输出到命令窗口,但我找不到哪个函数负责。谢谢!

【问题讨论】:

    标签: matlab command-prompt


    【解决方案1】:

    如果所有输出都由您自己的代码打印,您可以轻松地将所有 fprintfdisp 调用替换为您自己的函数调用,这些函数调用可以选择在所有输出前面加上函数名称。

    代码如下:

    getfunctionname.m:

    function [CurrentFunctionName, PreviousFunctionName] = getfunctionname()
    CurrentFunctionName = '';
    PreviousFunctionName = '';
    MyStack = dbstack('-completenames');
    if (length(MyStack) < 2)
        error('Function getfunctionname.m cannot be called from MATLAB console.');
    elseif (length(MyStack) == 2)
        CurrentFunctionName = MyStack(2).name;
    else
        CurrentFunctionName = MyStack(2).name;
        PreviousFunctionName = MyStack(3).name;
    end
    return
    

    myprintf.m:

    function myprintf(varargin)
    global PrefixOutputWithFunctionName
    if (PrefixOutputWithFunctionName)
        [~, PreviousFunctionName] = getfunctionname;
        fprintf('### %s.m:\n', PreviousFunctionName);
    end
    disp(sprintf(varargin{:}));
    return
    

    mydisp.m:

    function mydisp(varargin)
    global PrefixOutputWithFunctionName
    if (PrefixOutputWithFunctionName)
        [~, PreviousFunctionName] = getfunctionname;
        fprintf('### %s.m:\n', PreviousFunctionName);
    end
    disp(varargin{:});
    return
    

    mainfunction.m:

    function mainfunction()
    global PrefixOutputWithFunctionName
    
    % set PrefixOutputWithFunctionName to false to disable prefixing.
    PrefixOutputWithFunctionName = true;
    
    % the code goes here...
    
    % example output.
    myprintf('some text...\n some more text...');
    return
    

    【讨论】:

    • 感谢您的回复!我无法得到它......我试过但我收到以下错误:???达到最大递归限制 500。使用 set(0,'RecursionLimit',N) 更改限制。请注意,超出可用堆栈空间可能会使 MATLAB 和/或您的计算机崩溃。 ==> getfunctionname 中的错误
    • 好吧,getfunctionname 使用dbstack 获取调用getfunctionname 函数的函数的名称并返回它。实际上你也可以使用mfilename,但要获得前一个函数的名称,无论如何你都需要使用dbstackmyprintf 检查全局变量 PrefixOutputWithFunctionName 的值,如果为真,则在 fprintf 输出前加上调用它的函数的名称。 mainfunction.m 只是一个简单的示例,您可以如何定义全局变量 PrefixOutputWithFunctionName 并使用 myprintfmydispdisp 类似。
    • getfunctionname 通过运行 mainfunction 示例代码对我来说运行良好。我认为您在不同的配置中使用它(可能在递归函数中?)然后不知何故您耗尽堆栈或达到递归限制,也许dbstack与它有关,我不确定。
    • 再次感谢 nrz,我不确定发生了什么。它也适用于我的 mainfunction,但是当我在完整代码中使用它时,它会达到递归限制。我会再看一遍,让你知道!
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多