波の性質を持つデータ​列のピークからピーク​までのデータ点数をカ​ウントしたい

1 view (last 30 days)
Cir 2t
Cir 2t on 12 Mar 2021
Commented: Cir 2t on 15 Mar 2021
タイトル通りなのですが、添付データ列は横軸を時間でプロットすると波の性質を持ちます。
添付データは、0-70.5までを0.01刻みで微分方程式で説いた結果になります。
この時、データのピークからピークまでの時間が知りたいです。
しかし、どのようにコードを書けばよいかわかりません。
できればコードを教えてほしいですが、何かヒントでもよいので教えてほしいです。
よろしくお願い申し上げます

Accepted Answer

OH
OH on 12 Mar 2021
findpeaks()で一発です。
arr = load('data.mat');%data読み込み
[~,col] = findpeaks(arr);
T = col(2)-col(1);
ーおまけー
急ぎならこれで良いのですが、なんだか面白みに欠けます。
そこで、やり方というか発想について書きます。"今回の波形のみ"に対応してます。
for文で配列を精査していきます。
今回は波形が減少スタートなので谷を探します。
1つ前の値と比較して谷についたらスイッチを1にセット。
同様にして山についたらスイッチを2にセット。
同様にして谷についたら谷から谷の1周期のデータ数がわかるといった感じです。
s = 0;%スイッチ
for i = 2:length(arr)
if s == 0 && arr(i) > arr(i-1)
s = 1;
res1 = i;
end
if s == 1 && arr(i) < arr(i-1)
s = 2;
end
if s == 2 && arr(i) > arr(i-1)
res2 = i;
break
end
end
res = res2-res1;%結果
  3 Comments
OH
OH on 13 Mar 2021
実際のデータは7051x45だったのですね。
このエラー文で見るべきは"Xをベクトルにする必要があります。"というメッセージだけです。
そのため、引数として与えたXを、ベクトルにして与えてあげれば良いわけです。
これくらいのデータならfor文で回すのが一番簡単ですかね。以下いかがでしょうか。
T = zeros(size(X,2),1);%事前割り当て
for i = 1:size(X,2)
[~,col] = findpeaks(X(:,i));
T(i,1) = col(2)-col(1);
end
Cir 2t
Cir 2t on 15 Mar 2021
ありがとうございました。
自分一人では、永遠に解決できなかったです。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!