从一个数组中获取最大值,并在另一个数组中找到它的位置

时间:2012-10-25 08:42:08

标签: matlab max

我是Matlab的新手,但我真的需要学习它。希望它对我的研究非常有用。 现在我面临以下问题。

我有两张图片(名为A和B)。两者在同一维度上具有7层(4169,6289,7)。首先,我想在A图像中找到具有最大值的图层,然后在B图像中查找相应的值。例如:如果A图像中的第五层具有最大值,我需要B图像中第五层的值。 我刚刚写了这段代码c = max(a,[],3)来找到A图像中具有最大值的图层,但不知道设置为在B图像中获得相应的值。你可以帮我吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

您不需要max的值,您需要第二个参数,即索引。

 [~,indexOfMax] = max(a,[],3); %#Get index of maximal element
 [g1,g2] = ndgrid( 1:size(a,1),1:size(a,2) );  %#Create all possible rows,cols
 linearIndex = sub2ind(size(a), g1(:),g2(:),index(:))  %#Linearize the index of the maximal elements
 value = b(linearIndex); %# Collect the maximal values from b

@RodyOldenhuis对内存消耗是正确的。这是一种更节省内存的for循环方法:(可能运行得更快,也可能运行得更快,请自行检查)。

 vals = zeros(size(a(:,:,1)));
 [~,indexOfMax] = max(a,[],3);
 for i=1:size(a,1)
    for j=1:size(a,2)
        vals(i,j) = b(i,j, indexOfMax(i,j));
    end 
 end

答案 1 :(得分:0)

这是另一种观点,它的内存效率更高:

% get the indices in 3rd dimension for the max values
[~,I] = max(imgA,[],3)

% Collect all values through double loop
Bvals = arrayfun(@(y) ...
    arrayfun(@(x) imgB(x,y, I(x,y)), 1:size(imgA,1)), ...
    1:size(imgA,2), 'UniformOutput',false);

% reshape them so they correspond to the images' size again
Bvals = reshape([Bvals{:}], size(I))