局所最小値の並び替えを行いたい
8 views (last 30 days)
Show older comments
局所的最大値のドキュメンテーションに以下の説明があります。
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
lsor
局所的最小値でも同様に並び替えが可能でしょうか?
lsorの様に局所的最小値のx軸の数値も抽出したいのですが、うまくいきません。
何か良い方法があればご教示いただければ幸いです。
0 Comments
Accepted Answer
Shunichi Kusano
on 7 Jul 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
lsor
% オプション(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 Comments
Shunichi Kusano
on 7 Jul 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))'))
More Answers (0)
See Also
Categories
Find more on 信号の生成と前処理 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!