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

Posted

技术标签:

【中文标题】在 MATLAB/Octave 中查找 N 维数组中的所有局部最小值【英文标题】:Find all local minima in an N-dimensional array in MATLAB/Octave 【发布时间】:2020-03-11 00:51:12 【问题描述】:

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

对于二维数组,一个粗略的想法是

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

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

有没有办法制作一个处理任意维度的函数?我确定有一个,因为许多用于处理数组的内置函数可以处理任意维度,但我不知道如何处理。

【问题讨论】:

如果找到区域最小值就够了,镜像包上有imregionalmin。它适用于任意数量的维度。 你知道域中每个维度的界限吗? carandraug,谢谢!我没有意识到这一点。 SecretAgentMan,维度是可变的。为什么我需要提前知道呢?我总能用 size() 找到它。 【参考方案1】:

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

通过在数据的多个方向上应用此函数,并找到这些布尔数组的交集(简单的&amp;,元素明智的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')

【讨论】:

我不确定这是否适用于 N-d 案例,但我现在没有一个很好的例子来检查。 可能值得指出,尽管isMax = imregionalmax(Z) 方法也会使其与八度兼容(使用“图像”包) rinkert,具有讽刺意味的是,islocalmin 尚未适应 Octave,但 imregionalmin 已适应。我只会使用 imregionalmin。还是谢谢你!

以上是关于在 MATLAB/Octave 中查找 N 维数组中的所有局部最小值的主要内容,如果未能解决你的问题,请参考以下文章

ILNumerics 等效于 MatLab/Octave 语句

MATLAB/Octave 不会缩短长数字

需要帮助编写一个函数来查找 N 维数组 C++ 中的最大值和最小值

如何从 GTK+2 C 代码中调用 matlab/octave 函数

斐波纳契函数在matlab / octave中

MATLAB/Octave 中的 LIBSVM - libsvmread 的输出是啥?