13

如果我有一个数组(直到运行时长度未知),有没有办法以数组的每个元素作为单独的参数来调用函数?

像这样:

foo = @(varargin) sum(cell2mat(varargin));
bar = [3,4,5];
foo(*bar) == foo(3,4,5)

上下文:我有一个n-d 数组的索引列表,Q. 我想要的是类似的东西Q(a,b,:),但我只有[a,b]。由于我不知道n,我不能只对索引进行硬编码。

4

1 回答 1

15

MATLAB 中没有运算符可以做到这一点。但是,如果您的索引(即bar在您的示例中)存储在单元格数组中,那么您可以这样做:

bar = {3,4,5};   %# Cell array instead of standard array
foo(bar{:});     %# Pass the contents of each cell as a separate argument

{:}从元胞数组创建一个逗号分隔的列表。这可能是您在示例中可以得到的最接近“运算符”形式的东西,除了覆盖现有运算符之一(在此处此处说明)以便它从标准数组生成逗号分隔的列表,或创建您自己的类来存储您的索引并定义现有运算符如何为其操作(胆小的人都不是这个选项!)。

对于索引任意 ND 数组的具体示例,您还可以使用该sub2ind函数从下标索引计算线性索引(如这里这里详述),但您最终可能会比我的逗号分隔列表做更多的工作上面的解决方案。另一种选择是自己计算线性索引,这将回避转换为元胞数组并仅使用矩阵/向量运算。这是一个例子:

% Precompute these somewhere:
scale = cumprod(size(Q)).';  %'
scale = [1; scale(1:end-1)];
shift = [0 ones(1, ndims(Q)-1)];

% Then compute a linear index like this:
indices = [3 4 5];
linearIndex = (indices-shift)*scale;
Q(linearIndex)  % Equivalent to Q(3,4,5)
于 2012-01-11T19:47:11.050 回答