【问题标题】:MATLAB: How to subset a multidimensional matrix using 1-D vector indices without for loops?MATLAB:如何在没有 for 循环的情况下使用一维向量索引对多维矩阵进行子集化?
【发布时间】:2015-07-18 04:56:14
【问题描述】:

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

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

【问题讨论】:

  • 这里的困难在于维度,特别是如果您在编程时不知道它。我过去所做的是将切片字符串放在一起,然后对其使用 eval 。不好,但如果有人对任意数量的维度有更好的想法。
  • @Trilarion 在这种情况下,您可以使用从元胞数组生成的逗号分隔列表;查看我的更新答案

标签: arrays matlab multidimensional-array


【解决方案1】:

其实很简单:

B = A(ind_1, ind_2, ind_3);

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

如果在编程时维数未知,您可以在单元格数组中定义索引,然后扩展为comma-separated list

ind = {[1 4 5], [1 2], [1 2]};
B = A(ind{:});

【讨论】:

    【解决方案2】:

    您可以通过简单地指定索引来引用矩阵中的数据,如下例所示:

    B = A(start:stop, :, 2);
    

    在示例中:

    1. start:stop 获取两点之间的数据范围
    2. : 获取所有条目
    3. 2 只获得一个条目

    在你的情况下,因为你所有的索引都是一维的,你可以简单地使用:

    C = A(x_index, y_index, z_index);
    

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      相关资源
      最近更新 更多