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

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

 Accepted Answer

OH
OH on 12 Mar 2021

1 vote

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

Cir 2t
Cir 2t on 13 Mar 2021
ありがとうございます。
arr = load('data.mat');%data読み込み
[~,col] = findpeaks(arr);
T = col(2)-col(1);
でやってみようと思ったのですが、findpeaks(arr)のarrをXに変更し、X=7051行×45列の周期データ(添付テータ)を入れたのですが、下記のエラーが返ってきました。 findpeaks関数の説明文を読んでもイマイチ、内容がわからないのですが、もしよろしければご教授願いたいです。
エラー findpeaks
X を ベクトル にする必要があります。
エラー findpeaks>parse_inputs (line 70)
validateattributes(X,{'numeric'},{'nonempty','real','vector'},...
エラー findpeaks (line 59)
[X,Ph,Pd,Th,Np,Str,infIdx] = parse_inputs(X,varargin{:});
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)

Asked:

on 12 Mar 2021

Commented:

on 15 Mar 2021

Community Treasure Hunt

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

Start Hunting!