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

조회 수: 19 (최근 30일)
riku
riku 2019년 11월 6일
댓글: michio 2019년 11월 7일
添付したファイルのように0.1820secが8つ続いているデータがあります。
これに対して、0.0001/8secごと等間隔に時間を加え、同じ時間のデータをずらしたいと考えています。
さらに、0.1830secのようにデータ数が16個続いてるデータが連続しているものもあります。
その場合は、0.0001/16secごと等間隔に時間を加え、同様にずらしたいです。
実際は膨大なデータがあり、これを実現できずに困っています。
よろしくお願います。
  댓글 수: 1
Takumi
Takumi 2019년 11월 6일
添付ファイルは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, ...
のような配列を作りたいということですか?

댓글을 달려면 로그인하십시오.

채택된 답변

michio
michio 2019년 11월 6일
なかなか綺麗にやる方法を思いつかなかったので、思い切って泥臭くやってみます。
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
Akira Agata
Akira Agata 2019년 11월 7일
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
michio 2019년 11월 7일
おぉ、、これはすごい!綺麗ですね。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

Community Treasure Hunt

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

Start Hunting!