Matlab数组的动态切片

3

我有一个n维数组A,想要动态地切片它,即给定一个数组维度列表,例如[2 4]和一个值列表,例如[6 8],我希望...

B = A(:,6,:,8,:,:,:,:,...)

列表长度未知。使用 eval 可以解决,但不是一个选项。这个问题是对 先前的帖子 的多个索引和维度的概括,而不需要使用 for 循环。

@rayryeng,但我也认为这是一个重复的问题。它有什么不同之处? - Luis Mendo
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - rayryeng
@rayryeng 我明白了。投票也是如此。 - Luis Mendo
@rayryeng 噢,它已经重新开放了。 - Luis Mendo
@LuisMendo - 嘿嘿,是的。我将其标记为重复内容。如果在该主题上拥有金徽章的人标记了它,然后重新打开它,它会立即重新打开。 - rayryeng
显示剩余3条评论
1个回答

3
你仍然可以使用我之前链接的先前的帖子来回答你的问题。该原始帖子只在一个维度上进行切片。我最初将其标记为重复并关闭它,因为你只需要在原始帖子的已接受答案中替换一行代码即可实现你想要的效果。然而,由于这并不是很明显,我决定重新打开问题并为您解答。
参考之前的帖子,这就是Andrew Janke(链接帖子上有被接受的答案的人)所做的事情(非常聪明,我必须说):
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]);

请注意,ixdim必须包含相同数量的元素,并且它们必须是1D。此外,ixdim应该是合理的输入(即不是浮点数和负数)。我没有进行错误检查,因为我假设你知道自己在做什么,足够聪明以正确使用它。


祝你好运!


1
非常感谢您重新开放这个问题并提供详细的答案。这正是我所需要的。 - ASML

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