同じ秒数のデータを等間隔に分割したい
18 views (last 30 days)
Show older comments
添付したファイルのように0.1820secが8つ続いているデータがあります。
これに対して、0.0001/8secごと等間隔に時間を加え、同じ時間のデータをずらしたいと考えています。
さらに、0.1830secのようにデータ数が16個続いてるデータが連続しているものもあります。
その場合は、0.0001/16secごと等間隔に時間を加え、同様にずらしたいです。
実際は膨大なデータがあり、これを実現できずに困っています。
よろしくお願います。
1 Comment
Takumi
on 6 Nov 2019
添付ファイルは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, ...
のような配列を作りたいということですか?
Accepted Answer
michio
on 6 Nov 2019
なかなか綺麗にやる方法を思いつかなかったので、思い切って泥臭くやってみます。
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
Akira Agata
on 7 Nov 2019
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);
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!