Arrays MATLAB:如何使用1-D向量索引子集多维矩阵,而不使用for循环?
我目前正在寻找一种在MATLAB中切片多维矩阵的有效方法。例如,假设我有一个多维矩阵,比如Arrays MATLAB:如何使用1-D向量索引子集多维矩阵,而不使用for循环?,arrays,matlab,multidimensional-array,Arrays,Matlab,Multidimensional Array,我目前正在寻找一种在MATLAB中切片多维矩阵的有效方法。例如,假设我有一个多维矩阵,比如 A=rand(10,10,10) 我想在每个维度的特定索引处获得这个矩阵的子集(我们称之为B)。为此,我可以访问每个维度的索引向量: ind_1 = [1,4,5] ind_2 = [1,2] ind_3 = [1,2] 现在,我这样做效率很低,如下所示: N1 = length(ind_1) N2 = length(ind_2) N3 = length(ind_3) B = NaN(N1,N2,N3
A=rand(10,10,10)
我想在每个维度的特定索引处获得这个矩阵的子集(我们称之为B
)。为此,我可以访问每个维度的索引向量:
ind_1 = [1,4,5]
ind_2 = [1,2]
ind_3 = [1,2]
现在,我这样做效率很低,如下所示:
N1 = length(ind_1)
N2 = length(ind_2)
N3 = length(ind_3)
B = NaN(N1,N2,N3)
for i = 1:N1
for j = 1:N2
for k = 1:N3
B(i,j,k) = A(ind_1(i),ind_2(j),ind_3(k))
end
end
end
我怀疑有一种更聪明的方法可以做到这一点。理想情况下,我正在寻找一种解决方案,它不用于循环,可以用于任意
N
维矩阵 其实很简单:
B = A(ind_1, ind_2, ind_3);
如您所见,Matlab索引可以是向量,然后结果是这些向量索引的笛卡尔积。有关Matlab索引的更多信息可以找到
如果编程时维数未知,可以在单元格a中定义索引,然后展开为:
只需指定索引即可引用矩阵中的数据,如以下示例所示:
B = A(start:stop, :, 2);
在示例中:
start:stop
获取两点之间的数据范围:
获取所有条目2
只获取一个条目C = A(x_index, y_index, z_index);
这里的困难在于维度,特别是当您在编程时不知道它的时候。我过去所做的是将一个切片字符串放在一起,然后使用eval进行评估。不太好,但如果有人对任意数量的维度有更好的想法。@Trilarion在这种情况下,您可以使用从单元格数组生成的逗号分隔列表;查看我的最新答案
C = A(x_index, y_index, z_index);