以编程方式确定脚本是否正常发布或执行

Joh*_*ohn 4 matlab publish

发布R2016a之前,出版 MATLAB中的方式来记录一个脚本的结果.我发现当我手动运行脚本时,我经常pause在整个脚本中放置命令.有没有一种简单的方法来确定脚本是否已发布?然后,我可以将我的暂停包含在一些代码中:

if isNotPublishing
    pause();
end
Run Code Online (Sandbox Code Playgroud)

我的google foo让我无法找到解决方案.

Sue*_*ver 5

一个简单的方法是查看是否publish在调用堆栈中.dbstack将返回一个structs 数组,指示调用哪些函数以什么顺序到达我们调用的点dbstack.我们可以使用该name属性告诉我们所有这些函数的名称,并查看是否publish在其中.如果是,那么我们假设脚本是通过调用的publish.

stack = dbstack;
isBeingPublished = ismember('publish', {stack.name});
Run Code Online (Sandbox Code Playgroud)

或者,如果你想要一个单行

isBeingPublished = ismember('publish', cellfun(@(x)x.name, dbstack, 'UniformOutput', 0));
Run Code Online (Sandbox Code Playgroud)

无论是使用" 发布"工具栏还是使用命令行发布脚本,这都应该有效

publish('myscript.m')
Run Code Online (Sandbox Code Playgroud)

如果你想变得非常花哨,你可以超载pause(或编写你自己的版本mypause),为你做这个检查.这是有效的,因为在你的新pause函数中,dbstack仍然会包含,publish因为你从你的脚本中调用它,最终由它来评估publish.如果你创建了这个函数,那么你不需要代码中的所有逻辑,而只需要调用它mypause().

function mypause(varargin)
    stack = dbstack;
    if ~ismember('publish', {stack.name});
        builtin('pause', varargin{:})
    end
end
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!对任何不太熟悉MATLAB的人发表评论/警告.MATLAB允许您[缩短参数对的名称](http://stackoverflow.com/q/25907412/2338750),如果它们可以用更少的字母唯一标识.因此,`uni,0`是`UniformOutput,false`的缩写.陷阱是:如果Mathworks决定他们想要一个`UniformInput`,'UniqueOutput`,`'niversal`或类似的东西,所有带有`uni`的代码都会失败.因此,我建议您总是花时间写出参数对的全名. (2认同)