【问题标题】:How to extract multiple elements from specific positions in an ND array in matlab?如何从matlab中的ND数组中的特定位置提取多个元素?
【发布时间】: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);

然后我想使用indB 中提取元素。最佳选择类似于C = B(ind),但这显然行不通。 Matlab 将ind 称为线性索引,就像我写C = B(ind(:)) 一样,除了C 的大小变成ind(即1*3*2)。

所以我也尝试了类似的方法(我找到了here):

m = {ind,':',':'};
C = B(m{:})

但这会产生一个大小为 6*3*2 的数组,其中indB 中每一列的线性索引。当然,我可以使用循环来做到这一点,但我很确定有一种更高效、更优雅的方式。

示例:

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


【解决方案1】:

对于三维,您可以使用sub2ind 将(子)索引转换为线性索引:

[~, ind] = max(A,[],1);
linind = sub2ind(size(A), reshape(ind, size(A,2), size(A,3)), ...
    repmat((1:size(A,2)).', 1, size(A,3)), ...
    repmat(1:size(A,3), size(A,2), 1));
C = B(linind);

对于任意数量的维度,在调用max 之前将第一个维度之外的所有维度折叠成一个更容易。这也使得用更快的手动计算替换sub2ind 变得更容易:

Ar = reshape(A, size(A,1), []); % collapse all dimensions beyond the first
[~, ind] = max(Ar,[],1); % arg max of each column
linind = ind + (0:size(Ar,2)-1)*size(Ar,1); % convert to linear indices
C = B(linind); % index into C
sz = size(A); % size of A
C = reshape(C, sz(2:end)); % reshape C according to shape of A

【讨论】:

  • 感谢您的回答。您如何将其概括为我原来的问题(大小为 10*4*4*2*4)?我只需要为每个维度添加repmats 吗?
  • 谢谢一百万!它就像一个魅力;)更重要的是 - 我能理解这一点......只要我有更多的免费选票,我会 +1(我今天用完了)
猜你喜欢
  • 2018-12-30
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多