我可以指定nargout作为MATLAB函数调用的一部分吗?

时间:2012-05-25 17:25:49

标签: matlab indexing

问题:

我想索引函数调用的结果,该函数调用返回可变数量的输出参数,而不将结果存储在临时值中。

getel = @(x,i) x(i); #% simple anonymous function to index into a vector
x = zeros(2,2,2);
row = getel(ind2sub(size(x), 8), 1) #% desired: 2 (row 2)
#% actual: 8 (linear index)-because ind2sub is returning 1 value only
[row col dep]=ind2sub(size(x),8) #% row=2, ind2sub returning 3 values

使用示例:

x(1).val1 = [1 2 3];
x(1).val2 = [2 1 2];
x(2).val1 = [2 1 2];
x(2).val2 = [1 0 0];

#% The normal way I would do this, with a temporary variable
[~,ind] = min(x(1).val2); #% ind=2
v(1) = x(1).val1(ind);
[~,ind] = min(x(2).val2); #% ind=2
v(2) = x(2).val1(ind);

#% I'd like to be able to do this with arrayfun:
v = arrayfun(@(s) s.val1(min(s.val2), x);
                  -------^ returns value of minimum, not index

上面的arrayfun不起作用 - 被调用的min形式返回一个输出:最小值。为了使其正常工作,一个选项是以下假设函数调用:

v = arrayfun(@(s) s.val1(getoutputnum(2, 2, @min, s.val2)), x);
   hypothetical function -----------^ ^  ^  ^-func  ^--func args
      which form (nargout) of func ---|  |- which arg to return

我意识到对于上面的场景,我可以使用

s.val1(find(s.val2==min(s.val2),1,'first'))

或其他技巧,但在所有情况下都不可能。

ind2sub的情况下,我可能想要知道特定维度的索引(比如说列) - 但是函数的1输出形式只返回一个线性索引值 - n维表单需要被调用,即使维度1的值是我关心的。

注意:我意识到编写一个函数文件会使这个变得微不足道:使用~[out] = func(in)形式。但是,在编写脚本或仅在命令行上时,能够在匿名函数中完成所有操作会很好。我也意识到毫无疑问还有其他方法来解决这个问题;我只想知道是否可以指定要调用的函数的形式,以及可能返回哪个输出编号,而不使用out=func(in)语法,从而允许更好地嵌套函数。 / p>

2 个答案:

答案 0 :(得分:0)

你可以这样做吗?

在自己的档案中:

function idx=mymin(x)
  [~,idx] = min(x);

在您的代码中:

v = arrayfun(@(s) s.val1(mymin(s.val2), x);

可能有语法错误;我在写这个的电脑上没有MATLAB。这个想法是这样的:只需包装MATLAB的min并捕获第二个参数,这是x中最小值位置的逻辑索引。

答案 1 :(得分:0)

我可以让ind2sub()返回这样的变量args:

x = zeros(2,2,2);
c = cell(ndims(x),1);
[c{:}] = ind2sub(size(x), 8);

c单元阵列现在将具有3D索引c = {2; 2; 2}。

[c{:}] = ind2sub(size(x), 2);

将产生c = {2; 1; 1}。

这是你在找什么?