Arrays MATLAB:如何使用1-D向量索引子集多维矩阵,而不使用for循环?

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

我目前正在寻找一种在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)

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
    只获取一个条目
  • 在您的情况下,由于所有索引都是1D,您只需使用:

    C = A(x_index, y_index, z_index);
    

    这里的困难在于维度,特别是当您在编程时不知道它的时候。我过去所做的是将一个切片字符串放在一起,然后使用eval进行评估。不太好,但如果有人对任意数量的维度有更好的想法。@Trilarion在这种情况下,您可以使用从单元格数组生成的逗号分隔列表;查看我的最新答案
    C = A(x_index, y_index, z_index);