필터 지우기
필터 지우기

x軸の値を表記転換するには?

조회 수: 7 (최근 30일)
nknknknk
nknknknk 2017년 8월 2일
댓글: Jiro Doke 2017년 8월 16일
ファイルのデータから日時情報を取り出し、グラフのx軸に設定するにはどうすれば良いでしょうか?
下記の質問の補足になります。
下記プログラムで、出したグラフを添付します。 ①10/13 0:00-23:59、②2016/10/15 13:00-13:10
このグラフは
x軸がデータ番号となっており、 データ数:512個で、最初の100個は背景光(無視)、 100番目が0[m]になります。
距離分解能は、15[m]なので、
#0~99 Background
#100 0[m]
#101 15[m]
#102 30[m]
....
#200 1500[m]
...
#500 6000[m]
..
#511 6165[m]
end となります。
そこで、 1.x軸について、データ番号から観測距離[m]に表記変換したい。 データ番号を100からスタートさせ、100→0,101→15,102→30 と表記を変更したい。 2.データセットが4つあるうちの、2,4番目のみ取得して、グラフに表示させたい。
の方法をお聞きしたいです。よろしくお願い致します。
if true
% code
end
DebugFiles = 'C:\Users\aboken\Documents\MATLAB\161015\*16A1513.0*';
%指定フォルダ内のファイルをリスト化 日にち指定
D = dir(DebugFiles);
% ファイルオープン
fid=fopen(D(i).name);
% ヘッダー読み込み
for k = 1:3
headers{k} = fgetl(fid);
end
% データセットの数を取り出し
third_header = sscanf(headers{3},'%f');
num_datasets = 4third_header(end);
% データセットのヘッダーを読み込み
datasetheader = {};
for k = 1:num_datasets
datasetheader{k} = fgetl(fid);
end
fread(fid,2,'uint8') % Read CRLF=13d 10d
% データセットのヘッダーに記載されたデータ分バイナリデータを読み込む
data = {};
for k = 1:num_datasets
dataheader_parsed = sscanf(datasetheader{k},'%d');
num_read = dataheader_parsed(4);
[data{k},cunt] = fread(fid,num_read,'long');
fread(fid,2,'uint8'); % Read CRLF=13d 10d
end
% データファイルのクローズ
fclose(fid);
% 行列に整形(各データの数が同じ場合は成功)
DataMat = [data{:}];
plot(DataMat)
hold on
end
  댓글 수: 5
Jiro Doke
Jiro Doke 2017년 8월 4일
お手数ですが、もとの質問を上記の正しい質問に書き換えていただけますか?nknknknkさんのアイコンの下に「Edit」というリンクがあるので、そこから修正してください。とりあえず回答は下にしておきます。
nknknknk
nknknknk 2017년 8월 4일
修正いたしました。 ご忠告ありがとうございます。

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

채택된 답변

Jiro Doke
Jiro Doke 2017년 8월 4일
新しい質問に対して回答します。
1. データ番号を100(正確には101 : MATLAB は1から数えるため)から15刻みで表記。
plot コマンドの前にx軸となるベクトルを定義すればできます。
% まず 0 ~ 511 までの 15 刻みのベクトルを作成し、そこから 100 のオフセットをひく
x = (0:15:511*15) - 100*15;
plot(x,DataMat)
2. データセットが 4 つあるうちの、2,4 番目のみ取得して、グラフに表示させたい。
if 構文を使って、2,4番目のみをプロット。1.の回答と合わせると
if (i == 2) || (i == 4) % i が 2 か 4 ならば
% まず 0 ~ 511 までの 15 刻みのベクトルを作成し、そこから 100 のオフセットをひく
x = (0:15:511*15) - 100*15;
plot(x,DataMat)
hold on
end
  댓글 수: 11
nknknknk
nknknknk 2017년 8월 15일
ご回答ありがとうございます。 それは試したのですが、
エラー ./
行列の次元は一致しなければなりません。
エラーの発生場所 ReadFile2jou (line 44)
plot(x,DataMat./x.^2)
と同じようにエラーメッセージが出ます。 他にどのようなことが考えられるでしょうか。
Jiro Doke
Jiro Doke 2017년 8월 16일
DataMat がベクトルではなくて行列であるのに気づきませんでした。
そのエラーは割り算や二乗するときは同じ大きさ(行x列)同士でなければならないというエラーです。 DataMat は行列で x はベクトルだからですね。こういう時は大きさが同じになるように複製などして揃えてあげる必要があります。例えば
plot(x,DataMat./(repmat(x(:),1,size(DataMat,2)).^2))
関数 repmat のドキュメントを確認してみてください。もし分かりづらい場合は以下のような簡単な例で試してみてください。
x = 1:5;
DataMat = rand(5,3);
plot(x,DataMat./(repmat(x(:),1,size(DataMat,2)).^2))

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 行列および配列에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!