首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MATLAB:如何使用一维向量索引来子集多维矩阵而不使用for循环?

MATLAB:如何使用一维向量索引来子集多维矩阵而不使用for循环?
EN

Stack Overflow用户
提问于 2015-05-07 14:32:37
回答 2查看 277关注 0票数 4

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

A = rand(10,10,10)

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

代码语言:javascript
运行
复制
ind_1 = [1,4,5]
ind_2 = [1,2]
ind_3 = [1,2]

目前,我这样做的效率相当低,具体如下:

代码语言:javascript
运行
复制
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维矩阵。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-07 14:34:45

其实很简单:

代码语言:javascript
运行
复制
B = A(ind_1, ind_2, ind_3);

正如你所看到的,Matlab指数可以是向量,结果是这些向量指数的笛卡儿积。有关Matlab索引的更多信息可以找到这里

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

代码语言:javascript
运行
复制
ind = {[1 4 5], [1 2], [1 2]};
B = A(ind{:});
票数 5
EN

Stack Overflow用户

发布于 2015-05-07 14:38:01

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

代码语言:javascript
运行
复制
B = A(start:stop, :, 2);

在本例中:

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

在您的例子中,由于您的所有索引都是1D,所以只需使用:

代码语言:javascript
运行
复制
C = A(x_index, y_index, z_index);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30104111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档