如何使用 max 或 min 返回的多维索引?

How can I use the multidimensional index returned by max or min?

在 MATLAB 中,

[M,I] = max(A, [], dim) 

returns 最大值和这些最大值的索引 沿指定维度 dim。当 A 是一个多维数组时,变量 I 原来是一个与 A 具有相同维度的多维数组,除了 dim 维度设置为 1。我的问题是如何使用索引多维数组 I 从 A 中取回最大值.

为了提供一个特定的用例,我想在维度 dim 上获得具有最大 实部 的复数,当 A 可以包含复数时。

我可以用

[M,I] = max(real(A), [], dim) 

获取最大实部及其索引。但是,如何在这些索引处获得原始复杂变量?我对 A 的维度超过 2 维的情况特别感兴趣。

如果 dim 是任意的,最简单的方法是将其移动到第一维(使用 permute)以简化索引返回:

A = randn(2,3,4)+1j*randn(2,3,4); %// example data
dim = 2; %// dimension along which to maximize
Ap = permute(A, [dim 1:dim-1 1+dim:ndims(A)]); %// move dim to 1st dim
[M,I] = max(real(Ap), [], 1); %// minimize function of Ap along 1st dim
ind = I + reshape(0:size(Ap,1):numel(Ap)-1, size(I)); %// build linear indices from I
values = Ap(ind); %// index into Ap to get minimizing values

检查是否有效:使用 A 非复杂(因此 real 什么都不做)并将 valuesM 进行比较:

>> A = randn(2,3,4);
dim = 2;
Ap = permute(A, [dim 1:dim-1 1+dim:ndims(A)]);
[M,I] = max(real(Ap), [], 1);
ind = I + reshape(0:size(Ap,1):numel(Ap)-1, size(I));
values = Ap(ind);
values == M

ans(:,:,1) =
     1     1
ans(:,:,2) =
     1     1
ans(:,:,3) =
     1     1
ans(:,:,4) =
     1     1