【问题标题】:Find two MAXIMUM values' position in 3D matrix (MATLAB)在 3D 矩阵中查找两个 MAXIMUM 值的位置(MATLAB)
【发布时间】:2015-03-18 12:25:53
【问题描述】:

我在识别 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)。但我需要两个索引位置,在本例中为13。而且这个和其他A(:,:,:)一样。

我已经通过 SO 进行了搜索,但由于我在 MATLAB 中表现不佳,因此找不到解决此问题的方法。

请帮我解决这个问题。如果我不需要使用 for 循环来获得所需的输出会更好。

【问题讨论】:

  • 如果A(2,1,1)5 怎么办?
  • @Divakar 对于这种情况,5 仍然小于 8。我的目标是为每个具有两个最大值的 3D 矩阵找到一行并确定它们的索引。
  • a row for each 3D matrix with two maximum value?我在这里迷路了!写下预期的输出?
  • 抱歉,我正在尝试@Nemesis 给我的代码。我看到你也提供了替代方案。竖起大拇指! =)
  • 好吧,我想您正在寻找这两个 shots 之一,只是不确定是哪一个。

标签: matlab matrix multidimensional-array


【解决方案1】:

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]

示例运行 -

>> 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_idx_triplet(:,2) 就是你要找的东西!


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

%// 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_idx_triplet(:,2) 就是你要找的东西!

【讨论】:

  • 感谢您的替代品@Divakar
【解决方案2】:

以下代码为您提供了相应最大值的列和行。

第一步将获得包含第一和第二维度的每个子矩阵的最大值。由于默认情况下 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 用于将输出转换为矩阵。最后一步,来自find 的线性索引被ind2sub 转换为子索引。

[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 中的值是您想要的值。

【讨论】:

  • 我已经尝试运行它的程序,这对我来说有点复杂,但它确实给了我想要的结果。谢谢@Nemesis
  • 不客气。我将用一些关于代码的 cmets 编辑答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多