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

8 visualizzazioni (ultimi 30 giorni)
yuta
yuta il 6 Lug 2022
Commentato: yuta il 9 Lug 2022
局所的最大値のドキュメンテーションに以下の説明があります。
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軸の数値も抽出したいのですが、うまくいきません。
何か良い方法があればご教示いただければ幸いです。

Risposta accettata

Shunichi Kusano
Shunichi Kusano il 7 Lug 2022
上下をひっくり返せば局所最小値→局所最大値になりますので、検出が可能です。
この場合はベース(元のゼロ値)が最大値になるので、プロミネンスを上手く設定するなどして、所望の結果を得ることができるかと思います。
下記がサンプルになります。ゼロのところでの検出を除きたい場合、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 Commenti
Shunichi Kusano
Shunichi Kusano il 7 Lug 2022
回答してから気付きましたが、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 il 9 Lug 2022
2つも方法をご教示いただきまして、ありがとうございます。解決いたしました!

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su 信号の生成と前処理 in Help Center e File Exchange

Prodotti


Release

R2022a

Community Treasure Hunt

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

Start Hunting!