是否可以在运行时动态指定输出参数

时间:2016-05-14 14:16:56

标签: matlab arguments

我想知道是否可以在运行时将函数的输出参数指定为调用者?例如,如果在第一个输入参数中使用1乘N向量调用,函数'ind2sub'可以返回对应N个下标的N个输出,如下所示

[row,col]=ind2sub([3,2],5)

[row,col,dep]=ind2sub([3,2,3],5)

这两个调用将线性索引5分别转换为2-d下标[2,2]和3-d下标[2,2,1]。

我要问的是,我们可以在运行时指定输出参数,当我们调用'ind2sub'而不知道第一个参数究竟是什么时?或者你们通常做些什么来处理这种情况,你事先并不知道你会得到多少输出?

1 个答案:

答案 0 :(得分:1)

您需要使用varargout来完成此任务。 varargout是一个单元格数组(用输出参数填充),你将varargout代替函数的传统输出参数。但是,您在varargout中放置的许多项目都会指示提供了多少输出参数。

function varargout = functionName(nOutputs)
    if nOutputs == 1
        varargout{1} = [1,2];
    else
        varargout = {1,2};
    end
end

functionName(1)
%//  1   2

[a, b] = functionName(2)
%//  a = 1
%//  b = 2

如果要确定用户请求的输出参数数量,可以使用nargout

function varargout = functionName()
    if nargout == 1
        varargout = {[1, 2, 3]};
    elseif nargout == 2
        varargout = {1, [2, 3]};
    else
        varargout = {1, 2, 3};
    end
end

functionName()
%//  1   2   3

[a,b] = functionName()
%// a = 1
%// b = [2, 3]

[a,b,c] = functionName()
%// a = 1
%// b = 2
%// c = 3

<强>更新

如果在调用端需要变量输出参数,那么您也可以使用单元格数组,并依赖于{:}的单元格数组扩展来填充所有值。

nOutputs = 2;
output = cell(nOutputs, 1);
[output{:}] = functionName();
%// {1, [2, 3]}

或者,如果您不知道输出的数量(仅当您在函数中不使用varargout时才有效。)

outputs = cell(nargout('functionName'), 1);
[outputs{:}] = functionName();

对于ind2sub的具体示例,您可以执行类似的操作。

sz = [3, 2, 3];
outputs = cell(size(sz));
[outputs{:}] = ind2sub(sz, 5);