【发布时间】:2017-06-20 01:47:27
【问题描述】:
我有两个 ND 数组 (10*4*4*2*4),我在其中查找第一个中每列的最大值,并希望从第二个中提取相同位置的元素。
为了简单起见,假设我有 A 和 B 如下:
A = randi(100,4,3,2);
B = randi(10,size(A));
现在,我查找最大元素的索引:
[~,ind] = max(A);
然后我想使用ind 从B 中提取元素。最佳选择类似于C = B(ind),但这显然行不通。 Matlab 将ind 称为线性索引,就像我写C = B(ind(:)) 一样,除了C 的大小变成ind(即1*3*2)。
所以我也尝试了类似的方法(我找到了here):
m = {ind,':',':'};
C = B(m{:})
但这会产生一个大小为 6*3*2 的数组,其中ind 是B 中每一列的线性索引。当然,我可以使用循环来做到这一点,但我很确定有一种更高效、更优雅的方式。
示例:
A(:,:,1) =
40 89 30
73 77 30
59 61 14
29 2 30
A(:,:,2) =
82 79 5
3 40 62
46 76 42
22 52 74
B(:,:,1) =
5 1 9
3 3 5
8 4 4
8 3 9
B(:,:,2) =
1 4 3
5 4 8
10 8 5
9 1 3
ind(:,:,1) =
2 1 1
ind(:,:,2) =
1 1 4
所以结果应该是:
C =
3 1
1 4
9 3
请注意,我寻找的是一种通用解决方案,而不是只适合本示例中的尺寸的解决方案。
【问题讨论】:
-
在您的示例中,
C的所需大小(形状)是多少? -
C应该看起来像squeeze(ind)。 -
太好了,我的解决方案就是这样做的
标签: arrays matlab multidimensional-array indexing