Arrays Matlab阵列的动态切片
我有一个n维数组A,希望动态地对它进行切片,也就是说,给定一个数组维度列表,如[24],和一个值列表,如[68],我希望Arrays Matlab阵列的动态切片,arrays,matlab,multidimensional-array,dynamic,slice,Arrays,Matlab,Multidimensional Array,Dynamic,Slice,我有一个n维数组A,希望动态地对它进行切片,也就是说,给定一个数组维度列表,如[24],和一个值列表,如[68],我希望 B = A(:,6,:,8,:,:,:,:,...) 列表长度未知。使用eval可以工作,但不是一个选项。这个问题是对多个索引和维度的概括,没有for循环。您仍然可以使用。这篇原始文章只在一个维度上进行切片。我最初将它标记为一个副本并关闭了它,因为您需要做的就是替换原始帖子接受答案中的一行代码,以实现您想要的。然而,因为这不是很明显,我决定重新开始这个问题,为你回答这个问题
B = A(:,6,:,8,:,:,:,:,...)
列表长度未知。使用eval可以工作,但不是一个选项。这个问题是对多个索引和维度的概括,没有for循环。您仍然可以使用。这篇原始文章只在一个维度上进行切片。我最初将它标记为一个副本并关闭了它,因为您需要做的就是替换原始帖子接受答案中的一行代码,以实现您想要的。然而,因为这不是很明显,我决定重新开始这个问题,为你回答这个问题
参考上一篇帖子,这是(在链接帖子上有公认答案的人)所做的(我可能会补充说,这非常聪明):
给定矩阵a
、索引号ix
和要访问的维度dim
,上述函数将等效地执行:
out = A(:, :, ..., ix, :, :,...:);
^ ^ ^ ^
dimensions --> 1 2 dim dim+1
您可以在dim
中访问所需的维度,并放置要用于切片到该维度中的值。因此,您可以这样称呼它:
out = slice(A, ix, dim);
function out = slice(A, ix, dim)
subses = repmat({':'}, [1 ndims(A)]);
subses(dim) = num2cell(ix);
out = A(subses{:});
该函数的工作原理是,subses
将生成一个包含':'
字符串的单元格数组(该字符串最终将转换为':'运算符),其长度等于a
的维度总数。接下来,您将访问dim
处的元素,该元素对应于您想要的维度,并将其替换为ix
。然后,您将展开此单元格数组,以便我们可以按照您在上述等效语句中看到的方式访问A
谁会想到可以使用字符串索引到数组中
现在,为了概括这一点,你所要做的就是做一个很小但非常关键的改变ix
现在将是索引的向量,而dim
将是要访问的维度的向量。因此,它看起来像这样:
out = slice(A, ix, dim);
function out = slice(A, ix, dim)
subses = repmat({':'}, [1 ndims(A)]);
subses(dim) = num2cell(ix);
out = A(subses{:});
我们在这里看到的唯一区别是代码的第二行。我们必须使用,以便您可以将每个元素转换为一个单元格数组,并将其切片到该单元格数组中,以使用所需的维度替换:
运算符。请注意,我们使用的是大括号和非大括号<代码>()大括号用于在单元格数组中进行切片,而{}
用于访问单元格数组内容。因为我们要将多个单元格分配给子集
,所以需要()
。然后,我们在A
中相应地执行切片
因此,考虑到您的问题以及上述修改,您将执行以下操作:
out = slice(A, [6 8], [2 4]);
请注意,ix
和dim
必须包含相同数量的元素,并且它们必须为1D。此外,ix
和dim
应该是合理的输入(即不是浮点和负数)。我不做这个错误检查,因为我假设你知道你在做什么,你足够聪明,知道如何正确使用它
祝你好运 这与相关的问题有什么概括或区别?@rayryeng,但我也认为这是重复的。这有什么不同?@LuisMendo-帖子只对其中一个频道进行了切片。我相信这篇文章不仅仅是为了一个人。我同意你当然可以延长重复的文章,但它可能需要更多的工作。有了这些,我决定重新打开它。使用上一篇文章,我将写一个答案。@rayryeng我明白了。投票表决too@rayryeng哦,已经重新开始了非常感谢你重新开始这个问题和你的详细答案。这正是我想要的。