1

ディスク上に1行ずつ読み取っているデータセットがあり、データの列の1つをfloatのベクトル(範囲は0〜23.99999)に変換したいと思います(その日)。

データは次のようになります。

2010/01/01,00:00:00.979131, 27.4485,  51.9362, 14.8,  6
2010/01/01,00:00:01.021977, 27.5149,  51.9375, 16.0,  6
2010/01/01,00:00:01.074032, 27.4797,  51.9446, 14.5, 10
2010/01/01,00:00:01.663689, 25.8441,-152.8141, 14.6,  6
2010/01/01,00:00:01.639541, 25.8744,-152.6122,  1.5,  5
2010/01/01,00:00:02.232099, -2.2447,  11.5023, 18.8,  6
2010/01/01,00:00:02.256351, -0.8135,  27.3139, 17.7,  5
2010/01/01,00:00:02.306734, -2.7797,  28.5109, 26.0,  5
2010/01/01,00:00:02.620765, 25.6656,-154.2029, 26.2,  9
2010/01/01,00:00:02.658495, 25.6698,-154.2157, 23.0,  6
2010/01/01,00:00:02.731266, -5.7106, 126.4517,  3.6,  5
2010/01/01,00:00:02.787495, -5.7138, 126.5210, 24.4,  8
2010/01/01,00:00:02.811636, -3.2453, 124.6919, 21.1,  8

列2(例:00:00:00.979131)に関心があり、次のようなことをしたいと思います。

setenv GNUTERM 'x11';
fid = fopen('myfile.txt', 'r');
m = textscan(fid, '%d%d%d%d/%d%d/%d%d, %d%d:%d%d:%d%f, %f, %f, %f, %d');
mx = m(:, 5); %here, I would expect to grab 14.8, 16.0, etc
my = m(:, 2) / 24.0; %here, all data from timestamp column (00:00:00.979131, for ex)
plot(mx, my);

問題は、渡す文字列がtextscanデータに対して正しくフォーマットされていないことです。その数値のフォーマットは、軍事時間では「hrs:minutes:seconds」です。varsの値にアクセス/変換するにはどうすればよいですmxmy

ありがとう、jml

4

2 に答える 2

6

の出力textscanは cell 配列です。回答でコマンドを使用する場合:

m = textscan(fid, '%d/%d/%d %d:%d:%f %f %f %f %d', 'delimiter', ',');

次に、14.9、16.0、14.5 の垂直ベクトルを取得するには:

MyNinthField = m{9};

MyNinthField =
14.8000
16.0000
14.5000
14.6000
 1.5000
18.8000
17.7000
26.0000
26.2000
23.0000
 3.6000
24.4000
21.1000

次に、タイムスタンプ (1 日の始まりからの秒数) を取得するには:

Hours = double(m{4});
Minutes = double(m{5});
Seconds = m{6};

はすでにであるため、 forSeconds doubleは必要ありません。ただし、とは両方とも.m{6}doublem{4}m{5}int32

時刻を秒単位で取得するには、次のものが必要です。

TimeOfDayInSeconds = 3600*Hours+60*Minutes+Seconds;

TimeOfDayInSeconds =
0.97913
1.02198
1.07403
1.66369
1.63954
2.23210
2.25635
2.30673
2.62077
2.65849
2.73127
2.78749
2.81164

int32からへの型変換を行わなかった場合double、Octave は値を整数に切り捨てます。ただし、MATLAB では、integer 配列と double 配列の合計も許可されません。

お役に立てれば。

于 2012-12-31T23:28:59.573 に答える
0

次のようなことができるようです。

m = textscan(fid, '%d/%d/%d %d:%d:%f %f %f %f %d', 'delimiter', ',');

...これは機能しますが、必要な時間形式の変数を変数の複数の部分に配置します。何もないよりマシ。後でそれらの変数を連結する方法について誰かが提案を持っているなら、私はもっと読みたいです。ありがとう!

于 2012-12-31T21:24:09.167 に答える