per*_*iae 11 matlab operators multidimensional-array splat matrix-indexing
如果我有一个数组(在运行时之前长度未知),有没有办法调用一个函数,并将数组的每个元素作为一个单独的参数?
像这样:
foo = @(varargin) sum(cell2mat(varargin));
bar = [3,4,5];
foo(*bar) == foo(3,4,5)
Run Code Online (Sandbox Code Playgroud)
上下文:我有一个n
-d数组的索引列表Q
.我想要的是什么Q(a,b,:)
,但我只有[a,b]
.由于我不知道n
,我不能只是硬编码索引.
gno*_*ice 11
MATLAB中没有运算符可以做到这一点.但是,如果您的索引(即bar
在您的示例中)存储在单元格数组中,那么您可以这样做:
bar = {3,4,5}; %# Cell array instead of standard array
foo(bar{:}); %# Pass the contents of each cell as a separate argument
Run Code Online (Sandbox Code Playgroud)
在{:}
创建一个逗号分隔的列表从一个单元阵列.除了覆盖现有的一个运算符(这里和这里说明)之外,这可能是您在示例中最接近"运算符"形式的东西,以便它从标准数组生成逗号分隔列表,或者创建你自己的类来存储你的索引并定义现有操作符如何操作它(对于胆小的人来说都不是选择!).
对于索引任意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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1243 次 |
最近记录: |