局所最小値の並び替えを行いたい

6 ビュー (過去 30 日間)
yuta
yuta 2022 年 7 月 6 日
コメント済み: yuta 2022 年 7 月 9 日
局所的最大値のドキュメンテーションに以下の説明があります。
x = linspace(0,1,1000);
Pos = [1 2 3 5 7 8]/10;
Hgt = [3 4 4 2 2 3];
Wdt = [2 6 3 3 4 6]/100;
for n = 1:length(Pos)
Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end
PeakSig = sum(Gauss);
[psor,lsor] = findpeaks(PeakSig,x,'SortStr','descend');
psor
psor = 1×6
4.2603 4.0000 3.2552 3.0039 2.2135 1.9994
lsor
lsor = 1×6
0.2983 0.2002 0.1011 0.7998 0.7057 0.5005
局所的最小値でも同様に並び替えが可能でしょうか?
lsorの様に局所的最小値のx軸の数値も抽出したいのですが、うまくいきません。
何か良い方法があればご教示いただければ幸いです。

採用された回答

Shunichi Kusano
Shunichi Kusano 2022 年 7 月 7 日
上下をひっくり返せば局所最小値→局所最大値になりますので、検出が可能です。
この場合はベース(元のゼロ値)が最大値になるので、プロミネンスを上手く設定するなどして、所望の結果を得ることができるかと思います。
下記がサンプルになります。ゼロのところでの検出を除きたい場合、psor<-0.05等適当にフィルタリングする必要があります。
x = linspace(0,1,1000);
Pos = [1 2 3 5 7 8]/10;
Hgt = [3 4 4 2 2 3];
Wdt = [2 6 3 3 4 6]/100;
for n = 1:length(Pos)
Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end
PeakSig = sum(Gauss);
[psor,lsor] = findpeaks(-PeakSig,x,'SortStr','descend','MinPeakProminence',0.3);
psor
psor = 1×5
-0.0001 -0.0011 -1.3372 -1.8394 -2.1344
lsor
lsor = 1×5
0.4024 0.5866 0.1311 0.7397 0.2573
% オプション(0付近の最小値を除きたい場合)
wantedIdx = psor<-0.05;
psor = psor(wantedIdx);
lsor = lsor(wantedIdx);
% 可視化
figure;
plot(x,PeakSig);
hold on;
plot(lsor,-psor,'ro');
text(lsor+.02,-psor,num2str((1:numel(psor))'))
  2 件のコメント
Shunichi Kusano
Shunichi Kusano 2022 年 7 月 7 日
回答してから気付きましたが、islocalmin関数を使ってもいいですね。
x = linspace(0,1,1000);
Pos = [1 2 3 5 7 8]/10;
Hgt = [3 4 4 2 2 3];
Wdt = [2 6 3 3 4 6]/100;
for n = 1:length(Pos)
Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end
PeakSig = sum(Gauss);
lminIdx = find(islocalmin(PeakSig)); % 局所最小値のインデックスを取得
lminValues = PeakSig(lminIdx); % 局所最小値を取得
[~,sortIdx] = sort(lminValues); % 小さい順に並び替えを取得
lminIdx = lminIdx(sortIdx); % 並べ替え
lsor = x(lminIdx);
psor = PeakSig(lminIdx);
% オプション(0付近の最小値を除きたい場合)
wantedIdx = psor>0.05;
psor = psor(wantedIdx);
lsor = lsor(wantedIdx);
% 可視化
figure;
plot(x,PeakSig);
hold on;
plot(lsor,psor,'ro');
text(lsor+.02,psor,num2str((1:numel(psor))'))
yuta
yuta 2022 年 7 月 9 日
2つも方法をご教示いただきまして、ありがとうございます。解決いたしました!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeCalendar についてさらに検索

製品


リリース

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!