【发布时间】:2012-06-05 00:23:43
【问题描述】:
有谁知道如何在 Maltab 中找到向命令窗口提供输出的函数?我编写了一个包含许多函数的代码,我已经输出到命令窗口,但我找不到哪个函数负责。谢谢!
【问题讨论】:
标签: matlab command-prompt
有谁知道如何在 Maltab 中找到向命令窗口提供输出的函数?我编写了一个包含许多函数的代码,我已经输出到命令窗口,但我找不到哪个函数负责。谢谢!
【问题讨论】:
标签: matlab command-prompt
如果所有输出都由您自己的代码打印,您可以轻松地将所有 fprintf 和 disp 调用替换为您自己的函数调用,这些函数调用可以选择在所有输出前面加上函数名称。
代码如下:
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
【讨论】:
getfunctionname 使用dbstack 获取调用getfunctionname 函数的函数的名称并返回它。实际上你也可以使用mfilename,但要获得前一个函数的名称,无论如何你都需要使用dbstack。 myprintf 检查全局变量 PrefixOutputWithFunctionName 的值,如果为真,则在 fprintf 输出前加上调用它的函数的名称。 mainfunction.m 只是一个简单的示例,您可以如何定义全局变量 PrefixOutputWithFunctionName 并使用 myprintf。 mydisp 与 disp 类似。
getfunctionname 通过运行 mainfunction 示例代码对我来说运行良好。我认为您在不同的配置中使用它(可能在递归函数中?)然后不知何故您耗尽堆栈或达到递归限制,也许dbstack与它有关,我不确定。