MATLAB Answers

riku
0

同じ秒数のデータを等間隔に分割したい

Asked by riku
on 6 Nov 2019
Latest activity Commented on by michio
on 7 Nov 2019 at 0:46
添付したファイルのように0.1820secが8つ続いているデータがあります。
これに対して、0.0001/8secごと等間隔に時間を加え、同じ時間のデータをずらしたいと考えています。
さらに、0.1830secのようにデータ数が16個続いてるデータが連続しているものもあります。
その場合は、0.0001/16secごと等間隔に時間を加え、同様にずらしたいです。
実際は膨大なデータがあり、これを実現できずに困っています。
よろしくお願います。

  1 Comment

T.Tomita
on 6 Nov 2019 at 7:58
添付ファイルは0.1820secから始まっていて,それが8回続き,次の値が0.1830secなので,(0.1830-0.1820)/8=0.000125ずつ
0.182000, 0.182125, 0.182250, 0.182375 0.182500, 0.182625, 0.182750, 0.182875, 0.183000, ...
のような配列を作りたいということですか?

Sign in to comment.

1 Answer

michio
Answer by michio
on 6 Nov 2019 at 8:09
 Accepted Answer

なかなか綺麗にやる方法を思いつかなかったので、思い切って泥臭くやってみます。
load('test.mat')
[C,ia,ic] = unique(test);
% ia : 各要素の開始位置が入ります。
disp(ia);
% 連続数を diff で計算するために最後に数値を追加してきます。
idx = [ia;length(test)+1];
nofSeq = diff(idx); % それぞれの要素の連続数が分かります。
disp(nofSeq);
seconds2add = zeros(size(test)); % 各行に追加する秒数用の配列確保
for ii=1:length(nofSeq) % それぞれ個別に処理
% 0 - 0.001 の間を連続回数+1で分割
% (連続個数+1 にしないと不自然な感じがしました)
tmp = linspace(0,0.001,nofSeq(ii)+1)';
seconds2add(ia(ii):ia(ii)+nofSeq(ii)-1) = tmp(1:nofSeq(ii));
end
newtest = test+seconds2add; % 実際に足し合わせてみます。
format shortE % 表示変更
[test, seconds2add,newtest] % コマンドウィンドウで表示
plot(newtest) % プロットがやっぱり確認しやすい
実行するとコマンドウィンドウで結果を確認できると思いますが、どうでしょう。
1列目:test
2列目:seconds2add (追加数する秒数)
3列目:恐らく目的のデータ
です。
1.8200e-01 0 1.8200e-01
1.8200e-01 1.2500e-04 1.8212e-01
1.8200e-01 2.5000e-04 1.8225e-01
1.8200e-01 3.7500e-04 1.8237e-01
1.8200e-01 5.0000e-04 1.8250e-01
1.8200e-01 6.2500e-04 1.8262e-01
1.8200e-01 7.5000e-04 1.8275e-01
1.8200e-01 8.7500e-04 1.8287e-01
1.8300e-01 0 1.8300e-01
1.8300e-01 6.2500e-05 1.8306e-01
1.8300e-01 1.2500e-04 1.8312e-01
1.8300e-01 1.8750e-04 1.8319e-01
1.8300e-01 2.5000e-04 1.8325e-01
1.8300e-01 3.1250e-04 1.8331e-01
1.8300e-01 3.7500e-04 1.8337e-01
1.8300e-01 4.3750e-04 1.8344e-01
1.8300e-01 5.0000e-04 1.8350e-01
1.8300e-01 5.6250e-04 1.8356e-01
1.8300e-01 6.2500e-04 1.8362e-01
1.8300e-01 6.8750e-04 1.8369e-01
1.8300e-01 7.5000e-04 1.8375e-01
1.8300e-01 8.1250e-04 1.8381e-01
1.8300e-01 8.7500e-04 1.8387e-01
1.8300e-01 9.3750e-04 1.8394e-01
1.8400e-01 0 1.8400e-01
1.8400e-01 1.2500e-04 1.8412e-01
1.8400e-01 2.5000e-04 1.8425e-01
1.8400e-01 3.7500e-04 1.8437e-01
1.8400e-01 5.0000e-04 1.8450e-01
1.8400e-01 6.2500e-04 1.8462e-01
1.8400e-01 7.5000e-04 1.8475e-01
1.8400e-01 8.7500e-04 1.8487e-01

  3 Comments

riku
on 6 Nov 2019 at 8:44
ありがとうございます。大変参考になりました。
Akira Agata
on 7 Nov 2019 at 0:07
arrayfun をうまく使って、少しだけコンパクトに書くこともできます。
load('test.mat');
% 一意な要素(val)とその個数(len)を計算
val = unique(test);
len = arrayfun(@(x) nnz(test == x), val, 'Uniform', false);
len = cell2mat(len);
% 一意な要素は常に0.001づつ増加すると想定して、0.001を要素数で等分
newtest = arrayfun(@(x,y) linspace(x, x+0.001-(0.001/y), y)',val,len,'UniformOutput',false);
newtest = cell2mat(newtest);
michio
on 7 Nov 2019 at 0:46
おぉ、、これはすごい!綺麗ですね。

Sign in to comment.