【问题标题】:MATLAB m-function for finding local extrema [duplicate]用于查找局部极值的 MATLAB m 函数
【发布时间】:2015-02-01 15:25:37
【问题描述】:

我不是程序员,但我必须在 Matlab 中做一些非常简单的事情。我希望你能帮助我。

我在列中有一些数据,我需要找到局部极值。任何想法如何编写这几行代码?

【问题讨论】:

  • 你有什么样的数据? ) 矩阵、向量、解析表达式?您是否尝试过 matlab 帮助?
  • 什么数据?这是如此的数字[43.3091 44.4888,47.0707,48.7491,58883,50.4502,50.9328,50.9886,51.1923,51.5843,52.17,52.8798,52.177,52.8798,532.17,52.8798,53.676,54.11111111111]这是矩阵。我用谷歌搜索并找到了某种答案。我想我可以将 diff 函数与 signum 一起使用,但我不知道该怎么做;)
  • min(data_in_vector_form), max(data_in_vector_form).
  • 嗯,但这并没有找到只有一个最大值和一个最小值?全局极值。

标签: matlab max min


【解决方案1】:

有几种方法可以做到这一点。

1) 一个简单的方法是使用this script

2)如果数据量不大,可以自己编写算法分析每个点的梯度或者分析增量:

一维数组

jmin=0;
jmax=0;
for j=2:length(M)-1
    if (M(j)>M(j-1))&&(M(j)>M(j+1))
        jmax=jmax+1;
        max_index(jmax)=j;
        max_value(jmax)=M(j);
    end;
    if (M(j)<M(j-1))&&(M(j)<M(j+1))
        jmin=jmin+1;
        min_index(jmin)=j;
        min_value(jmin)=M(j);
    end;
end;

二维矩阵

jmin=0;
jmax=0;
s=size(M);
for j1=2:s(1)-1
    for j2=2:s(2)-1
        if (M(j1,j2)>M(j1-1,j2))&&(M(j1,j2)>M(j1+1,j2))&&(M(j1,j2)>M(j1,j2-1))&&(M(j1,j2)>M(j11,j2+1))
            jmax=jmax+1;
            max_index(jmax)=[j1,j2];
            max_value(jmax)=M(j1,j2);
        end;
        if (M(j1,j2)<M(j1-1,j2))&&(M(j1,j2)<M(j1+1,j2))&&(M(j1,j2)<M(j1,j2-1))&&(M(j1,j2)<M(j11,j2+1))
           jmin=jmin+1;
           min_index(jmin)=[j1,j2];
           min_value(jmin)=M(j1,j2);
        end;
    end;
end;

在这个算法中,我们检查每个点相对于其他四个相邻点的最大值或最小值。这种模式可以拥有更复杂的结构,并且可以根据数据包含更多的点。

【讨论】:

  • 是的,我分析了这段代码,它可能就是我要寻找的。谢谢!
  • 我已经更正了一个矩阵。如果数据有噪声,则单个交叉点是不够的。人们需要更复杂的东西。
  • 你能解释一下for循环中的代码吗?我的意思是“ j = 2:长度(M)-1”。意思是:当 j 等于 2 直到 M 的长度减去 1 时执行循环?
  • 是的,循环从数组(矩阵)的第二个元素开始,一直运行到长度减一
  • 我将每个点与 2D 矩阵的四个相邻点进行比较(这四个相邻点形成一个十字,我用这种结构扫描整个矩阵)。对于 1D 数组,两个邻居就足够了,对于 3D 矩阵,一个至少需要 6 个邻居
【解决方案2】:

我发现了一些类似的东西,但我猜它是在没有单独的情况下找到极值的。

d = diff(a)
for i=1:N-2
         if d(i)==0                
            if sign(d(i-1))~=sign(d(i+1)) 
               maxmin = [maxmin, i];
            end
         elseif sign(d(i))~=sign(d(i+1))   
            maxmin = [maxmin, i+1];       
         end

【讨论】:

猜你喜欢
  • 2016-05-28
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
相关资源
最近更新 更多