我试图在第二维上找到三维矩阵的极值。
我开始
[~,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
。
答案 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))计算。