在matlab中找到多维矩阵的极值

时间:2014-01-20 13:22:03

标签: matlab max minimum

我试图在第二维上找到三维矩阵的极值。

我开始 [~,index] = max(abs(mat),[],2),但我不知道如何从这里前进。索引向量如何与原始矩阵一起使用。或者这个问题有完全不同的解决方案吗?

为了说明该任务,假设以下矩阵:

mat(:,:,1) =
    23     8    -4
    -1   -26    46
mat(:,:,2) =
     5   -27    12
     2    -1    18
mat(:,:,3) =
   -10    49    39
   -13   -46    41
mat(:,:,4) =
    30   -24    18
   -40   -16   -36

预期结果将是

ext(:,:,1) =
    23
   -46
ext(:,:,2) =
   -27
    18
ext(:,:,3) =
    49
   -46
ext(:,:,4) =
    30
   -40

我不知道如何将index向量与mat一起使用,以获得所需的结果ext

2 个答案:

答案 0 :(得分:3)

1)如果你想找到一个最大值,比方说,2d维,你的变量index将是一个具有维度(N,1,M)的矩阵,其中N和M是元素的数量分别在第一维和第三维中的矩阵。为了删除虚拟维度,存在函数squeeze():index=squeeze(index)之后size(index)给出N,M

2)根据你的问题,你可能需要matlab函数ind2sub()。首先,你拿一块矩阵,而不是用线性索引找到它的最大值,然后用int2sub()恢复你的指标。以下是2D矩阵的示例:

M = randn(5,5);
[C,I] = max(M(:));
[index1,index2] = ind2sub(size(M),I);

相同的方法允许在整个3D矩阵中找到绝对最大元素。

答案 1 :(得分:2)

使用ndgrid生成维度1和3的值,然后使用sub2ind将三个索引合并为linear index

[~, jj] = max(abs(mat),[],2); %// jj: returned by max
[ii, ~, kk] = ndgrid(1:size(mat,1),1,1:size(mat,3)); %// ii, kk: all combinations
result = mat(sub2ind(size(mat), ii, jj, kk));

一位发烧友,一线替代品:

result = max(complex(mat),[],2);

这是有效的,因为根据max documentation

  

对于复数输入A,max返回具有最大复数模数(幅度)的复数,用max(abs(A))计算。