问题:
我想索引到函数调用的结果中,该函数调用返回可变数量的输出参数,而无需将结果存储在临时中。
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)
语法,从而允许函数更好地嵌套。
你能做这样的事情吗?
在其自己的文件中:
function idx=mymin(x)
[~,idx] = min(x);
在您的代码中:
v = arrayfun(@(s) s.val1(mymin(s.val2), x);
可能有语法错误;我在写这篇文章的电脑上没有 MATLAB。不过,这个想法就在那里:只需包装 MATLAB 的min
并捕获第二个参数,即 x
中最小值位置的逻辑索引。
我可以让 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}。
这是你要找的吗?