当前位置: 首页 > 知识库问答 >
问题:

在3D矩阵中查找两个最大值的位置(MATLAB)

许天逸
2023-03-14

我在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(:,:,:)相同。

我已经搜索了这么多,但由于我在MATLAB方面很差,我找不到解决这个问题的方法。

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

共有2个答案

山阳辉
2023-03-14

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

第一步将获得包含第一和第二维度的每个子矩阵的最大值。由于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将输出转换为矩阵。最后一步,通过ind2subfind中的线性索引转换为子索引。

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

洪飞鸿
2023-03-14

快照#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)就是你要找的!

快照#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)就是你要找的!

 类似资料:
  • 我有一个大的NxN位数组,有K个1(其他都是0)。所有非零点的坐标都是已知的——换句话说,这个n×n数组可以表示为K对数组,每个数组包含一个非零点的x和y坐标。 给定一个HxW大小的子矩阵,我需要将其放在我的原始NxN数组上,使其覆盖大多数非零点。 输入:子矩阵的高度H和宽度W 输出:HxW子数组的x和y协弦,其内部有最多的协弦 之前也回答过类似的问题:2D矩阵中尺寸为HxW的最大子阵列,但在我的

  • 这个问题可能是封闭的,因为它听起来很模糊,但我真的问这个,因为我不知道或者我的数学背景不够。 我试图实现一个挑战,其中一部分挑战要求我计算矩阵的最小值和最大值。我对矩阵的实现及其操作没有任何问题,但是什么是矩阵的最小值和最大值?考虑到3x3矩阵是9个数中最小的数,最大的是最大的还是其他什么?

  • 我知道回溯会有所帮助,但如何呢?

  • 问题内容: 我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵。为了解决这个问题,我编写了以下代码: 这段代码可以正常工作,但是我不确定这是问题的确切解决方案还是可以解决。请提供您的专家意见。提前致谢。 问题答案: 该算法对4×4矩阵和2×2子矩阵进行了硬编码。否则,它看起来像蛮力算法。 我会这样表示: 如果您想要更有效的方法,建议您将它们压扁,如下所示: 并在此序列中搜索以下模式: 使用标准

  • 我有一个矩阵就像 现在我想删除每列的3个最大值,这样我就有了一个包含7行的新矩阵 我尝试为每列创建向量,然后用 然后把向量放到一个新的矩阵中,但由于我的矩阵有时有很多列,我想找到一种更简单的方法<谢谢你的帮助

  • 我有几个维度的多维矩阵,其中中的每个元素都是一个单独的传感器输入,是时间。我想做的是只分析中每个元素在上的峰值,因此我将得到一个的二维矩阵,其中只包含最大值。 我知道有很多方法可以获得单个整体最大值,但是有没有一种方法可以将它与逐个元素的操作相结合,比如,这样它就可以通过检查每个单独的元素? 如果你能给我任何帮助,我将感激不尽,因为我现在真的被困住了。提前谢谢!