【问题标题】:return multiple output variables from Matlab function从 Matlab 函数返回多个输出变量
【发布时间】:2014-02-18 15:21:06
【问题描述】:

假设我有一个函数:

function [ A, B, C ] = test(x, y, z)
    A=2*x;
    B=2*y;
    C=2*z;
end

当您按下运行时,Matlab 仅返回输出参数的第一个值 - 在本例中为 [A]。是否有一个命令可以放入我的函数中,它会自动返回所有函数输出参数[A,B,C],而不仅仅是第一个参数。 我知道我可以在命令窗口中输入[ A, B, C ] = test(x, y, z) 并获取所有值,但我有时很懒惰,只想按运行并自动获取所有值。

【问题讨论】:

    标签: matlab function


    【解决方案1】:

    一些选项:

    添加参数指定详细输出控制台但默认设置为false:

    function [ A, B, C ] = test(x, y, z, verbose)
    
       if nargin = 3
           verbose = false;
       end;
    
       A=2*x;
       B=2*y;
       C=2*z;
    
       if verbose
           fprintf('A = %f\nB = %f\nC = %f', A, B, C);
       end;
    
    end
    

    或将它们组合成一个输出:

    function output = test(x, y, z)
    
       A=2*x;
       B=2*y;
       C=2*z;
    
       output = [A, B, C]; %// Or {A;B;C} if they're not going to be the same size, but then it won't display anyway
    
    end
    

    或者,如果您真的想这样做,我想您可以编写一个包装函数,您可以在函数上调用它,它会为您显示所有三个,您可以在任何函数上通用使用它们。但这似乎不值得。

    【讨论】:

    • 如果您使用{A;B;C},您可以通过在代码末尾添加A=output{1}B=output{2}C=output{3} 来显示它们,不带分号。
    【解决方案2】:

    另一种选择是使用assignin 自动将输出参数保存到工作区

    function [ A, B, C ] = test(x, y, z)
        A=2*x;
        B=2*y;
        C=2*z;
    
        assignin('base', 'A', A);
        assignin('base', 'B', B);
        assignin('base', 'C', C);      
    end
    

    'base' 是从命令窗口调用变量时使用的主工作区的名称。

    这样您就可以在没有[A,B,C] = 部分的情况下在工作区中输入test(x,y,z),它仍然会为您提供所有值。

    与将 A、B 和 C 组合成一个输出相比,这样做的好处是您仍将在工作区中保存 3 个单独的变量。如果 A、B 和 C 是数组或单元格,这很有用。这种方法的一个缺点是,如果你在另一个函数中使用这个函数,它仍然只会使用 A 的值。例如:length(test(x,y,z)) 只会给出 A 的长度。

    【讨论】:

      【解决方案3】:

      Matlab 函数输出为单元格格式,因此您可以定义一个与函数输出大小相同的单元格数据,并将其用作单个变量,以更结构化的方式存储所有输出:)

      a = cell{3, 1};
      [a{:}] = test(x, y, z);
      A = a{1};
      B = a{2};
      C = a{3}; 
      

      【讨论】:

      • Matlab 函数输出为单元格格式,因此您可以定义一个与函数输出大小相同的单元格数据,并将其用作单个变量以更结构化的方式存储所有输出:)
      • wshan,感谢您的快速回复。我根本不知道 matlab,但您可以编辑您的答案,并使用尽可能多的信息对其进行更新。这将使这个答案对其他用户来说更加清晰易懂。但是,如果您可以改进答案,我会为您的答案 +1。
      • 请确保您的答案不会重复其他(现有)答案。或者,如果您想给出更好的答案(应该与问题相关),请解释为什么这个答案是更好的答案。
      • 如果我可以提出建议,请使用deal[A, B, C] = deal(a{:});
      • 第一行应该是 a=cell(3,1);代码很完美
      【解决方案4】:

      MATLAB 将自动输出不以';' 结尾的变量/表达式。

      因此,如果您只需要显示所有这些值,最简单的方法是:

      function [ A, B, C ] = test(x, y, z)
          A=2*x    % no ';' will print A's value automatically
          B=2*y    % no ';' will print B's value automatically
          C=2*z    % no ';' will print C's value automatically
      end
      

      【讨论】:

      • 唯一的问题是它总是会打印这些值,即使你不想要它们。
      • @Dan 是的。但适合OP输出所有值。 :P
      猜你喜欢
      • 2021-11-05
      • 2019-02-07
      • 2012-04-30
      • 2018-05-10
      • 2013-04-26
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多