我有一个n维数组A,想要动态地切片它,即给定一个数组维度列表,例如[2 4]和一个值列表,例如[6 8],我希望...
B = A(:,6,:,8,:,:,:,:,...)
列表长度未知。使用 eval 可以解决,但不是一个选项。这个问题是对 先前的帖子 的多个索引和维度的概括,而不需要使用 for 循环。
我有一个n维数组A,想要动态地切片它,即给定一个数组维度列表,例如[2 4]和一个值列表,例如[6 8],我希望...
B = A(:,6,:,8,:,:,:,:,...)
function out = slice(A, ix, dim)
subses = repmat({':'}, [1 ndims(A)]);
subses{dim} = ix;
out = A(subses{:});
给定矩阵A
,索引号ix
和您想要访问的维度dim
,上述函数等效地执行以下操作:
out = A(:, :, ..., ix, :, :,...:);
^ ^ ^ ^
dimensions --> 1 2 dim dim+1
dim
,并将要用于切片该维度的值放置在其中。因此,您可以这样调用它:out = slice(A, ix, dim);
subses
会生成一个 ':'
字符串的单元数组(最终将转换为 ':' 运算符),其长度与 A
的总维数相同。接下来,您将访问与您想要的维度对应的 dim
元素,并将其替换为 ix
。然后,您将展开此单元数组,以便以上述等效语句中所看到的方式访问 A
。
谁能想到您可以使用字符串来索引数组!?
现在,要将其推广,您只需要进行一个非常关键但非常小的更改。 ix
现在将是一个索引向量,dim
将是要访问的维度向量。因此,它将看起来像这样:
function out = slice(A, ix, dim)
subses = repmat({':'}, [1 ndims(A)]);
subses(dim) = num2cell(ix);
out = A(subses{:});
num2cell
,以便您可以将每个元素转换为单元数组,并且我们在此单元数组中切片以替换:
运算符与所需的维度。请注意,我们使用的是()
括号,而不是{}
括号。 ()
括号用于切片单元数组,而{}
用于访问单元数组内容。由于我们将多个单元格分配给subses
,因此需要()
。然后我们相应地在A
中执行我们的切片。out = slice(A, [6 8], [2 4]);
请注意,ix
和dim
必须包含相同数量的元素,并且它们必须是1D。此外,ix
和dim
应该是合理的输入(即不是浮点数和负数)。我没有进行错误检查,因为我假设你知道自己在做什么,足够聪明以正确使用它。
祝你好运!