我想知道是否可以在运行时将函数的输出参数指定为调用者?例如,如果在第一个输入参数中使用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'而不知道第一个参数究竟是什么时?或者你们通常做些什么来处理这种情况,你事先并不知道你会得到多少输出?
答案 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);