【问题标题】:Can I specify nargout as part of a MATLAB function call?我可以将 nargout 指定为 MATLAB 函数调用的一部分吗?
【发布时间】:2012-06-01 07:08:22
【问题描述】:

问题:

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

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) 语法的情况下指定调用哪种形式的函数,以及返回哪个输出编号,从而可以更好地嵌套函数。

【问题讨论】:

  • 我不确定我的问题是否正确。您是否尝试为匿名函数提供多个输出变量?
  • @EitanT 我编辑了这个问题;希望它更清楚。我发现要完整但仍然简洁地描述问题很棘手。为了直接回答你的问题,我知道如何从匿名函数返回多个参数,所以这不是问题:)

标签: matlab indexing


【解决方案1】:

我可以让 ind2sub() 像这样返回可变数量的参数:

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}。

这就是你要找的吗?

【讨论】:

  • 虽然这确实可以让您在不提前知道有多少维的情况下调用 ind2sub,但它不能在单个表达式中使用 - 因此它不能在 arrayfun 中的匿名函数中使用,例如。
【解决方案2】:

你能做这样的事吗?

在自己的文件中:

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

在您的代码中:

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

可能有语法错误;我正在写这篇文章的计算机上没有 MATLAB。这个想法是存在的:只需包装 MATLAB 的 min 并捕获第二个参数,它是 x 中最小值位置的逻辑索引。

【讨论】:

  • 正如我在问题末尾(在“注释”部分中)提到的那样,这肯定会起作用,但如果可能的话,我宁愿不需要为这样的事情创建文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多