找到两个最大值';三维矩阵中的位置(MATLAB)

找到两个最大值';三维矩阵中的位置(MATLAB),matlab,matrix,multidimensional-array,Matlab,Matrix,Multidimensional Array,我在3D矩阵(MATLAB)中识别两个最大值的位置时遇到了问题。假设我有矩阵A输出,如下所示: A(:,:,1) = 5 3 5 0 1 0 A(:,:,2) = 0 2 0 8 0 8 A(:,:,3) = 3 0 0 0 7 7 A(:,:,4) = 6 6 0 4 0

我在3D矩阵(MATLAB)中识别两个最大值的位置时遇到了问题。假设我有矩阵
A
输出,如下所示:

A(:,:,1) =

     5     3     5
     0     1     0


A(:,:,2) =

     0     2     0
     8     0     8


A(:,:,3) =

     3     0     0
     0     7     7


A(:,:,4) =

     6     6     0
     4     0     0
对于第一个
A(:,:,1)
,我想确定第一行的值最高
(A=5)
。但是我需要两个索引位置,在本例中,
1
3
。这与另一个
A(:,:,:)
相同

我已经搜索了所以,但由于我在MATLAB方面不好,我找不到解决这个问题的方法


请帮我做这件事。如果我不需要使用for循环来获得所需的输出,那就更好了。

下面的代码给出了相应最大值的列和行

第一步将获得包含第一维度和第二维度的每个子矩阵的最大值。由于“max”在默认情况下适用于第一个维度,因此将重新调整矩阵形状以合并原始第一个维度和第二个维度

max_vals = max(reshape(A,size(A,1)*size(A,2),size(A,3)));
max_vals = 
           5     8     7     6
在第二步中,使用第三维上的
arrayfun
获得等于每个子矩阵的相应
max_vals
的元素索引。由于
arrayfun
的输出是单元格,因此使用
cell2mat
将输出转换为矩阵。最后一步,通过
ind2sub
find
中的线性索引转换为子索引

[i,j] = ind2sub(size(A(:,:,1)),cell2mat(arrayfun(@(i)find(A(:,:,i)==max_vals(i)),1:size(A,3),'UniformOutput',false)))

i =
     1     2     2     1
     1     2     2     1

j =
     1     1     2     1
     3     3     3     2
因此,
j
中的值就是您想要的值。

Shot#1查找每个3D切片的最大值索引-

%// Reshape A into a 2D matrix
A_2d = reshape(A,[],size(A,3))

%// Find linear indices of maximum numbers for each 3D slice
idx = find(reshape(bsxfun(@eq,A_2d,max(A_2d,[],1)),size(A)))

%// Convert those linear indices to dim1, dim2,dim3 indices and
%// present the final output as a Nx3 array
[dim1_idx,dim2_idx,dim3_idx] = ind2sub(size(A),idx)
out_idx_triplet = [dim1_idx dim2_idx dim3_idx]
%// Get size of A
[m,n,r] = size(A)  

%// Reshape A into a 2D matrix
A_2d = reshape(A,[],r)

%// Find linear indices of highest two numbers for each 3D slice
[~,sorted_idx] = sort(A_2d,1,'descend')
idx = bsxfun(@plus,sorted_idx(1:2,:),[0:r-1]*m*n)

%// Convert those linear indices to dim1, dim2,dim3 indices
[dim1_idx,dim2_idx,dim3_idx] = ind2sub(size(A),idx(:))

%// Present the final output as a Nx3 array
out_idx_triplet = [dim1_idx dim2_idx dim3_idx]
样本运行-

>> A
A(:,:,1) =
     5     3     5
     0     1     0
A(:,:,2) =
     0     2     0
     8     0     8
A(:,:,3) =
     3     0     0
     0     7     7
A(:,:,4) =
     6     6     0
     4     0     0

out_idx_triplet =
     1     1     1
     1     3     1
     2     1     2
     2     3     2
     2     2     3
     2     3     3
     1     1     4
     1     2     4
out\u idx\u三元组(:,2)
就是您要找的


Shot#2查找每个3D切片中最高两个数字的索引-

%// Reshape A into a 2D matrix
A_2d = reshape(A,[],size(A,3))

%// Find linear indices of maximum numbers for each 3D slice
idx = find(reshape(bsxfun(@eq,A_2d,max(A_2d,[],1)),size(A)))

%// Convert those linear indices to dim1, dim2,dim3 indices and
%// present the final output as a Nx3 array
[dim1_idx,dim2_idx,dim3_idx] = ind2sub(size(A),idx)
out_idx_triplet = [dim1_idx dim2_idx dim3_idx]
%// Get size of A
[m,n,r] = size(A)  

%// Reshape A into a 2D matrix
A_2d = reshape(A,[],r)

%// Find linear indices of highest two numbers for each 3D slice
[~,sorted_idx] = sort(A_2d,1,'descend')
idx = bsxfun(@plus,sorted_idx(1:2,:),[0:r-1]*m*n)

%// Convert those linear indices to dim1, dim2,dim3 indices
[dim1_idx,dim2_idx,dim3_idx] = ind2sub(size(A),idx(:))

%// Present the final output as a Nx3 array
out_idx_triplet = [dim1_idx dim2_idx dim3_idx]

out\u idx\u三元组(:,2)
就是您要找的

如果在
a(2,1,1)
处有
5
怎么办?@Divakar在这种情况下,
5
仍然小于
8
。我的目标是为每个具有两个最大值的3D矩阵找到一行,并确定它们的索引。
为每个具有两个最大值的3D矩阵找到一行。
?我在这里迷路了!写下预期的输出?对不起,我正在尝试@Nemesis给我的代码。我看到你也提供了替代方案。竖起大拇指!=)我想你是在找这两个
镜头中的一个,只是不确定是哪一个。我试过运行这个程序,它对我来说有点复杂,但它确实给了我想要的结果。谢谢@nemesisy不客气。我将编辑答案,并对代码进行一些注释。感谢您在@Divakar提供的备选方案