我们假设我有一个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
中找到最大值的位置。
答案 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)
我们假设A
和B
是您拥有的两个矩阵,您需要从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(:))
,以将所需的输出作为列向量。