MATLAB:如何在没有 for 循环的情况下使用一维向量索引对多维矩阵进行子集化?

Ber*_* U. 4 arrays matlab multidimensional-array

我目前正在寻找一种在 MATLAB 中对多维矩阵进行切片的有效方法。举个例子,假设我有一个多维矩阵,例如

A = rand(10,10,10)

我想B在每个维度的某些索引处获得这个矩阵的一个子集(我们称之为)。为此,我可以访问每个维度的索引向量:

ind_1 = [1,4,5]
ind_2 = [1,2]
ind_3 = [1,2]
Run Code Online (Sandbox Code Playgroud)

现在,我这样做效率很低,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

我怀疑有一种更聪明的方法可以做到这一点。理想情况下,我正在寻找一种不使用 for 循环并且可以用于任意N维度矩阵的解决方案。

Lui*_*ndo 5

其实很简单:

B = A(ind_1, ind_2, ind_3);
Run Code Online (Sandbox Code Playgroud)

如您所见,Matlab 索引可以是向量,然后结果是这些向量索引的笛卡尔积。可以在此处找到有关 Matlab 索引的更多信息。

如果在编程时维度数未知,您可以在单元格数组中定义索引,然后扩展为逗号分隔列表

ind = {[1 4 5], [1 2], [1 2]};
B = A(ind{:});
Run Code Online (Sandbox Code Playgroud)