从其他实时脚本调用Matlab实时脚本时抑制输出

5

我有一个主脚本(main.mlx),它调用了两个其他的脚本(sub1.mlx,sub2.mlx)。我想在单独调用子脚本时显示输出结果,但是在调用主脚本时不想显示输出结果,尽管我希望在主脚本中显示一些内容。 我尝试在主脚本中在子脚本调用后加上分号。

最小工作示例

main.mlx:

clear vars

sub1;
sub2;

sub1.mlx:

syms A1 B1

A1 = B1

sub2.mlx:

syms A2 B2

A2 = B2

期望输出: 无

输出:

enter image description here

我尝试过的(不成功):

clear vars

run('sub1.mlx');
run('sub2.mlx');
2个回答

3

一个解决方案是:

clear vars
out1=evalc('sub1');
out2=evalc('sub2');

其中out1和out2是可选的,用于捕获输出。


2
以下黄金法则适用于任何MATLAB编码,并且在这里也适用:使用“;”抑制分配的显示,并在需要时显式地单独显示变量。在这种情况下,我们可以这样做:

始终使用;来抑制分配的显示,并在需要时显式地单独显示变量。

在这种情况下,我们可以执行以下操作:

  • Inside main.mlx, we write

    % Call the sub scripts without output
    bDisp = false;
    sub1; 
    sub2;
    
  • Inside sub1.mlx and sub2.mlx, you can structure your outputs to be more explicit

    % By default (when running this script alone), display things
    if ~exist( 'bDisp', 'var' )
        bDisp = true;
    end
    
    syms A1 B1
    % Terminate the assignment with a semi-colon to suppress output
    A1 = B1;
    % Explicitly display A1 here (if bDisp is enabled)
    if bDisp
        A1 % disp(A1) would be even more verbose, but doesn't show "A1 = "
    end
    
该方法使您可以控制何时显示内容,而不管从何处调用它们。
如果您愿意,可以将默认检查(在sub1.mlx/sub2.mlx的顶部)变得更加复杂。例如,您可以使用dbstack来确定执行代码所调用的位置(即哪个函数),但是活动脚本与堆栈有点奇怪。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接