MATLAB Note/ファイル操作 の変更点
Top / MATLAB Note / ファイル操作
- 追加された行はこの色です。
- 削除された行はこの色です。
- MATLAB Note/ファイル操作 へ行く。
#freeze
-目次
#contents
**ファイル読み込み [#m4bd70ea]
-配列の読み込み
--テキストファイル magik.txt に記述された以下のような値を、直接MATLABの配列に取り込みたいとします。
16.0 3.0 2.0 13.0
5.0 10.0 11.0 8.0
9.0 6.0 7.0 12.0
4.0 15.0 14.0 1.0
--カンマ区切りでも、スペース区切りでも、タブ区切りでもかまいません。
--MATLABへの読み込みは以下のようにします。
>> A = load('magik.txt')
A =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
-文字列の読み込み
--テキストファイル hello.txt に記述された以下のような文字列を、直接MATLABに取り込みたいとします。
HelloWorld1!
HelloWorld2!!
--MATLABへの読み込みは以下のようにします。
#geshi(matlab){{
[names,types,x,y,answer] = textread('hello.txt','%s%s%f%d%s');
charnames = char(names); %セル配列namesを文字列配列charnamesに変換
for count = 1:1:length(charnames(:,1)) %FOR文 1 ~ namesの最後の行まで順番に処理
line = charnames(count, :); %namesのcount行目をlineに格納
disp(line) %各行の中身を出力
end %FOR文終了
}}
HelloWorld1!
HelloWorld2!!
-Excel(.xls)ファイルの読み込み
--[[参考(初心者によるMATLABメモ):http://sach1o.blog80.fc2.com/blog-entry-21.html]]
**ファイル書き出し [#cebc083e]
-配列Aの中身をCSV形式のテキストで書き出したい場合は、以下のようにします。
>> csvwrite('output_filename.txt', A);
--【注意】&color(red){csvwriteの使用時には、有効数字の取り扱いに注意すること!!};((以下、菊池研M君の報告から引用しました。ありがとう!))
---特に何も指定しないと、有効数字が5桁までしか出力しないため、不具合が生じる場合がある。((参考:[[The MathWorks csvwriteについて:http://www.mathworks.com/access/helpdesk_ja_JP/help/techdoc/ref/csvwrite.html]]))
例:0.03ずつのフレームの表示
999.93
999.96
999.99
1000
1000
1000
1000.1
1000.1
---有効数字を指定したい場合、関数dlmwriteを使う。関数dlmwriteはprecision引数をつけることで、有効な桁数を指定できる。またdelimiter引数で行列要素の区切りに使用する文字列も指定できる。((参考:[[The MathWorks dlmwriteについて:http://www.mathworks.com/access/helpdesk_ja_JP/help/techdoc/ref/dlmwrite.html]]))
例:dlmwrite('R00M0036delta.csv',result,'delimiter',',','precision',6)
-文字列を書き出したい場合は、以下のようにします。
>> fid = fopen( 'outputFile.txt', 'wt'); %新規書き出しモードでファイル作成(追記モードはwt → a)
>> fprintf(fid,'%s\n', 'HelloWorld!!') %文字列改行モードで 'HelloWorld!!' と書き込む
>> fprintf(fid,'%s', 'HelloWorld!!') %文字列モードで 'HelloWorld!!' と書き込む
>> fclose(fid); %ファイルをクローズ
-[[参考 fprintfコマンドでテキストファイルに書き出したデータが改行されません:http://www.cybernet.co.jp/matlab/support/techkwdb/search_view.php?id=1240]]
**ヘッダやテキスト付きCSVファイル読み込み [#re93835e]
-[[テキスト、CSV、Excelの各形式で保存された、ヘッダーや列ラベルがある数値テキストデータをMATLABにインポートするには、どのようにすればよいですか。:http://www.mathworks.co.jp/support/solutions/ja/data/1-9N6WHZ/index.html?solution=1-9N6WHZ]]
-例えば、文字列を含む &ref(phoneTime.csv); を読み込むとします。
--一列目は音素名、二列目・三列目は開始・終了時間
--以下を実行します。
#geshi(matlab){{
file = importdata( 'phoneTime.csv' );
% 音素名が file.textdata に、開始・終了時間が file.data に格納される。
phone = file.textdata;
time = file.data;
% 順番に表示してみる
for count = 1 : 1 : length(phone)
disp(phone(count));
disp(time(count,:));
end
}}
-続いて、一行目にヘッダを含む &ref(phoneTime2.csv); を読み込むとします。
--以下を実行します。
#geshi(matlab){{
fid = fopen('phoneTime2.csv', 'rt');
% ヘッダ情報(1行目の文字列)を得る
text = textscan(fid, '%s', 1, 'delimiter', '\n');
% データ部(文字列 数値 数値形式で区切り記号は「,」)を得る
text = textscan(fid, '%s %f %f', 'delimiter', ',');
fclose(fid);
% 順番に表示してみる
for count = 1 : 1 : length(text{1})
disp(text{1}(count));
disp(text{2}(count));
disp(text{3}(count));
end
}}
-列サイズが大きい場合、Rのrep関数と同じようにrepmat関数が使えます(参考:[[A similar function to R's rep in Matlab [duplicate]:http://stackoverflow.com/questions/14615305/a-similar-function-to-rs-rep-in-matlab]])。使用例は[[VoiceSauce/F0解析結果の検討:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/112.html#fb4cce52]]を参照して下さい。
-[[MFCC解析のツール/MATLAB Auditory Toolbox, Praat, HTK の比較:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/106.html#adc90242]] で、様々な形式のテキストファイルを読み込んでいます。
**グラフの書き出し [#m70813d5]
-[[参考:http://robotics.naist.jp/~min-d/p/index.php?MATLAB#d7cd087b]](Ding Ming's Wiki@Japan)
-プロットしたグラフを、そのまま画像ファイルにして出力するには、以下のようにします。
>> X = [1 2 3 4 5 6 7 8] %プロット用データ列を宣言
X =
1 2 3 4 5 6 7 8
>> plot(X); %プロット(サーバで実行しても何も起きません)
>> saveas(gcf, 'plot', 'jpg'); %SAVEAS Figure線図を希望する出力形式で保存
--これで、変数Xのプロットグラフが「plot.jpg」として保存されます。
--サーバ上でグラフを作成するときなどに利用できます。
-さらに参考 - [[画像を取り込んで加工して出力する:http://homepage2.nifty.com/maronomori/deep/tech/docs/1.html]](画像処理で遊ぼう!)
**WAVファイル読み込み [#u18c3eb4]
-ファイルから取り込む
--WAVREAD Microsoft WAVE (".wav")サウンドファイルの読み込み
filename = '001.wav'; %読み込むファイル名を指定
[data,Fs,Bits] = wavread(filename);
--dataには音声データ(列表記の振幅)、Fsにはサンプリング周波数、Bitsには量子化ビット数が代入されます。
--音声データとサンプリング周波数については、[[MATLAB勉強会第三回:http://shinzan.human.waseda.ac.jp/~m-kouki/matlab_3.pdf]]
で詳しく解説しています。
-マイクで取り込む
--WAVRECORD Windows オーディオ入力デバイスを使って、音声を録音
Fs = 44100;
time = 3;
data = wavrecord(time*Fs, Fs, 1); %1chでtime秒間録音して、データをdataに格納
**WAVファイル書き出し [#t05c8574]
-WAVWRITE Microsoft WAVE (".wav")サウンドファイルへの書き出し
filename = '002.wav'; %書き出すファイル名を指定
wavwrite(data, Fs, 16, filename); %16 = 量子化ビット数
--量子化ビット数は、デジタルデータを作成するときの値の上限に関係します。とりあえず16にしておけば問題ないです。
**XML [#e7ae998d]
-[[xsltを実行する:http://www.mathworks.com/access/helpdesk_ja_JP/help/techdoc/index.html?/access/helpdesk_ja_JP/help/techdoc/ref/xslt.html]]