gpt4 book ai didi

arrays - Matlab数组的动态切片

转载 作者:行者123 更新时间:2023-12-05 04:16:18 25 4
gpt4 key购买 nike

我有一个 n 维数组 A 并想对其进行动态切片,即给定一个数组维数列表,如 [2 4] 和一个值列表,如 [6 8],我想要

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

列表长度未知。使用 eval 可以,但不是一种选择。这个问题是对 previous post 的概括。无需 for 循环的多个索引和维度。

最佳答案

您仍然可以使用 previous post I linked to (which I originally flagged as a duplicate) to answer your question .这篇原始帖子仅在一个维度上进行切片。我最初将其标记为重复并将其关闭,因为您需要做的就是替换原始帖子接受的答案中的一行代码以实现您想要的。但是,因为它不是那么明显,我决定重新打开问题并为您回答问题。

引用之前的帖子,就是这个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

Who would have thought that you can use strings to index into an array!?

现在,要概括这一点,您所要做的就是进行一个小但非常关键的更改。 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 必须 包含相同数量的元素,并且它们必须 是一维的。此外,ixdim 应该是合理的输入(即不是 float 和负数)。我不进行此错误检查,因为我假设您知道自己在做什么,并且您足够聪明,知道如何正确使用它。


祝你好运!

关于arrays - Matlab数组的动态切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27969296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com