Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Matlab阵列的动态切片_Arrays_Matlab_Multidimensional Array_Dynamic_Slice - Fatal编程技术网

Arrays Matlab阵列的动态切片

Arrays Matlab阵列的动态切片,arrays,matlab,multidimensional-array,dynamic,slice,Arrays,Matlab,Multidimensional Array,Dynamic,Slice,我有一个n维数组A,希望动态地对它进行切片,也就是说,给定一个数组维度列表,如[24],和一个值列表,如[68],我希望 B = A(:,6,:,8,:,:,:,:,...) 列表长度未知。使用eval可以工作,但不是一个选项。这个问题是对多个索引和维度的概括,没有for循环。您仍然可以使用。这篇原始文章只在一个维度上进行切片。我最初将它标记为一个副本并关闭了它,因为您需要做的就是替换原始帖子接受答案中的一行代码,以实现您想要的。然而,因为这不是很明显,我决定重新开始这个问题,为你回答这个问题

我有一个n维数组A,希望动态地对它进行切片,也就是说,给定一个数组维度列表,如[24],和一个值列表,如[68],我希望

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哦,已经重新开始了非常感谢你重新开始这个问题和你的详细答案。这正是我想要的。