トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索   ヘルプ   最終更新のRSS

MATLAB Note/ファイル操作 の変更点

Top / 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]]