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

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

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

michio
michio am 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 Kommentare
Akira Agata
Akira Agata am 7 Nov. 2019
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 am 7 Nov. 2019
おぉ、、これはすごい!綺麗ですね。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!