Matlab中是否有展开运算符(或等效语法)?

13
如果我有一个数组(在运行时长度未知),是否有一种方法可以将数组的每个元素作为单独的参数调用函数?
就像这样:
foo = @(varargin) sum(cell2mat(varargin));
bar = [3,4,5];
foo(*bar) == foo(3,4,5)

背景:我有一个指向 n-维数组的索引列表Q。我想要类似于Q(a,b,:)这样的东西,但是我只有[a,b]。由于我不知道n,所以我不能硬编码索引。

1个回答

15
在MATLAB中没有操作符可以完成这个任务。不过,如果您的索引(即您示例中的bar)存储在cell array中,则可以执行以下操作:
bar = {3,4,5};   %# Cell array instead of standard array
foo(bar{:});     %# Pass the contents of each cell as a separate argument

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

针对你提出的任意N维数组索引的具体例子,你也可以使用sub2ind函数从你的下标索引计算线性索引(详见herehere),但你可能会比我上面逗号分隔列表解决方案做更多的工作。另一种选择是自己计算线性索引,这将避免转换为单元数组并仅使用矩阵/向量操作。以下是一个示例:
% 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接