多维矩阵的最大线性索引 - MATLAB

时间:2014-10-29 15:24:40

标签: matlab matrix matrix-indexing

我们假设我有一个3-dimensional矩阵并沿第二维计算了max,并希望得到最大值的线性指数。但是,max-function仅返回一个维度的下标。

A = randn([5,5,5]);        % Generate random matrix
[M, Ind] = max(A,[],2);    % Take the max along dimension 2

如何将index转移到linear indexing,以便

M == A(Ind)

变成了真的吗?

我对这个问题的意图是我有two multi-dimensional个矩阵,需要计算max中的first。然后,我想要访问second矩阵中的值,正好是我在first中找到最大值的位置。

4 个答案:

答案 0 :(得分:2)

一种方法是使用sub2ind

A = randn([5,5,5]);       
[M, col] = max(A,[],2);   

[m,n,o] = size(A);

dim1 = mod((0:m*o-1)', m)+1;
dim2 = col(:);
dim3 = ceil((1:m*o)/m)';

ind = sub2ind(size(A), dim1, dim2, dim3)

验证它是否适用于

isequal(M(:), A(ind))

让它们具有与M相同的形状:

reshape(ind, m, 1, o)

答案 1 :(得分:1)

为其他维度创建索引。

在昏暗1中,索引需要最快变化:[1,2,...,size(A,1)]size(A,3)次:

idx1 = repmat((1:size(A,1))',size(A,3),1);

在dim 2中,索引由Ind给出。

在昏暗3中,索引需要更改最慢:[1,1,...,1] size(A,1)次,然后[2,2,...,2],依此类推,直到size(A,3)

idx3 = ones(size(A,1),1)*(1:size(A,3));

访问单个值:

 M_ = A(sub2ind(size(A),idx1(:),Ind(:),idx3(:)));

比较

M(:) == M_

答案 2 :(得分:1)

三维案例

[m, n, p] = size(A);
[M, Ind] = max(A,[],2);
LinInd = bsxfun(@plus, (1:m).', (0:p-1)*m*n); %'//
LinInd = LinInd(:) + (Ind(:)-1)*m;

所需的线性指数为LinInd。这会产生

A(LinInd) == M(:)

包含所有true条目(请注意右侧需要(:),以便比较有意义。)

一般多维案例

d = 3; %// dimension along which max will be computed
s = size(A);
sLow = prod(s(1:d-1));
sHigh = prod(s(d+1:end));
[M, Ind] = max(A,[],d);
LinInd = bsxfun(@plus, (1:sLow).', (0:sHigh-1)*sLow*s(d)); %'//
LinInd = LinInd(:) + (Ind(:)-1)*sLow;

答案 3 :(得分:0)

我们假设AB是您拥有的两个矩阵,您需要从max获取A个索引并使用这些索引编入B为期望的输出。实现相同目标的一种方法可能是这样的 -

%// Your code to get Ind
A = randn([5,5,5]);        % Generate random matrix
[M, Ind] = max(A,[],2);    % Take the max along dimension 2

%// ------- Solution code -------------

%// Get the size of A
[n1,n2,n3] = size(A)

%// Linear indices corresponding to column and third dimension indices
col_dim3_lin_idx = bsxfun(@plus,(Ind-1)*n1,permute([0:n3-1]*n1*n2,[1 3 2]))

%// Finally get the overall linear indices
linear_index = bsxfun(@plus,col_dim3_lin_idx,[1:n1]') %//'

%// Get the corresponding elements from B
out = B(linear_index)

将所需的线性索引作为2D数组的方式略有不同,就像这样 -

[n1,n2,n3] = size(A) %// Get the size of A
idx = bsxfun(@plus,bsxfun(@plus,squeeze((Ind-1)*n1),[0:n3-1]*n1*n2),[1:n1]')

idx(:)将是使用这种新方法的线性索引的列向量,您可以将其索引到B,即B(idx(:)),以将所需的输出作为列向量。