3

如何使用从 matlab 中的“min”函数返回的索引在三维的 3D 矩阵中检索其数据?例如,我有以下代码:

%a is a 3D matrix
[res, index] = min(a, [], 3);

我想使用索引访问最小元素,例如:

a(index);

注意:我不想使用 res 变量

4

2 回答 2

3

全部获取:

a=rand(3,2,3);
[res, index] = min(a, [], 3);

sizeA=size(a);
sizeA12 = prod(sizeA(1:2));
lin_idx = sub2ind([sizeA12 sizeA(3)],1:sizeA12,index(:)');
a(lin_idx)

ans =

        0.0344   0.0971   0.171   0.695  0.0318  0.187

>> res(:)'

ans =

        0.0344   0.0971   0.171   0.695  0.0318  0.187

更一般的方法

a=rand(3,2,3); % sample data

dim_min = 2; % dimension along to take the minimum
[res, index] = min(a, [], dim_min);

sizeA       = size(a);
sizeAstart  = prod(sizeA(1:dim_min-1));
sizeAend    = prod(sizeA(dim_min+1:end));
idstart     = repmat(1:sizeAstart,1,sizeAend);
idend       = repmat(1:sizeAend  ,1,sizeAstart);

lin_idx = sub2ind([sizeAstart sizeA(dim_min) sizeAend ],idstart,index(:)',idend);
a(lin_idx)

您还可以重塑结果以使其具有与原始矩阵相同的维度(省略最小化维度):

reshape(a(lin_idx),sizeA([1:dim_min-1 dim_min+1:end]))

适用于任何大小的数据矩阵或任何值dim_min(当然只要1<=dim_min<=ndims(a)

于 2012-05-10T08:19:01.433 回答
0

不幸的是,我没有获得评论冈瑟(将近六岁)答案所需的声誉点,但这里有一个错误,这使得“更一般的方法”不正确:

“idend”-index 不应与 repmat 重复,而应与 repelem 重复,以获得该索引所需的 1 1 1 2 2 2 3 3 3 顺序。下面是 Gunther 方法的一个功能示例:

更一般的方法(更正的同义词)

a=rand(3,2,3); % sample data

dim_min = 2; % dimension along to take the minimum
[res, index] = min(a, [], dim_min);

sizeA       = size(a);
sizeAstart  = prod(sizeA(1:dim_min-1));
sizeAend    = prod(sizeA(dim_min+1:end));
idstart     = repmat(1:sizeAstart,1,sizeAend);
idend       = repelem(1:sizeAend  ,1,sizeAstart);

lin_idx = sub2ind([sizeAstart sizeA(dim_min) sizeAend ],idstart,index(:)',idend);
% check correct result
isequal(a(lin_idx)',res(:))
于 2018-07-05T11:58:46.740 回答