在MATLAB / Octave中找到N维数组中的所有局部最小值

时间:2019-11-14 22:16:53

标签: arrays matlab octave minimum

我想找到通用代码来查找MATLAB或Octave中N维数组中的所有局部最小值。

对于2D阵列,大概是

localmin = [];
for i=2:N-1
    for j=2:N-1
        if M(i,j)<=M(i,j+1) && M(i,j)<=M(i,j-1) && M(i,j)<=M(i+1,j) && M(i,j)<=M(i-1,j)
            localmin = [localmin,[i;j]];
        end
    end
end

(当然,需要用不同的条件来处理数组的末端,但是为了简单起见,我忽略了这一点。)

是否有一种方法可以制作处理任意尺寸的单个函数?我肯定有一个,因为许多用于处理数组的内置函数可以处理任意维,但是我不知道该如何处理。

1 个答案:

答案 0 :(得分:2)

您可以使用islocalmaxislocalminimregionalmax是Matlab中图像处理工具箱的一部分,所以我想并非所有人都可以使用)。这些函数将沿着某个维在n维数组中找到局部最小值,并在这些局部最大值或最小值的位置返回一个带有1的布尔数组。

通过在数据的多个方向上应用此函数,并找到这些布尔数组的交集(简单地&,元素明智的and),您可以找到本地峰的位置。

% generate some data
x = -10:0.1:10;
y = -10:0.1:10;
[X,Y] = meshgrid(x,y); 
Z = cos(X).*sin(Y).*(X+Y);

% determine maxima and minima
% For Matlab without image processing toolbox:
isMax = islocalmax(Z,1) & islocalmax(Z,2); % combine maxima along first dim with second dim
isMin = islocalmin(Z,1) & islocalmin(Z,2);
% Octave with image package and Matlab with image processing toolbox:
isMax = imregionalmax(Z);
isMin = imregionalmin(Z);

% plot
figure(1);clf;
surf(X,Y,Z);
hold on
scatter3(X(isMax), Y(isMax), Z(isMax), 'r', 'filled')
scatter3(X(isMin), Y(isMin), Z(isMin), 'b', 'filled')

enter image description here