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

MATLAB Note/ファイル操作

Last-modified: 2015-02-24 (火) 01:06:40
Top / MATLAB Note / ファイル操作

ファイル読み込み

  • 配列の読み込み
    • テキストファイル 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への読み込みは以下のようにします。
      [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)ファイルの読み込み

ファイル書き出し

  • 配列Aの中身をCSV形式のテキストで書き出したい場合は、以下のようにします。
    >> csvwrite('output_filename.txt', A);
    • 【注意】csvwriteの使用時には、有効数字の取り扱いに注意すること!!*1
      • 特に何も指定しないと、有効数字が5桁までしか出力しないため、不具合が生じる場合がある。*2
        例:0.03ずつのフレームの表示
        999.93
        999.96
        999.99
        1000
        1000
        1000
        1000.1
        1000.1
      • 有効数字を指定したい場合、関数dlmwriteを使う。関数dlmwriteはprecision引数をつけることで、有効な桁数を指定できる。またdelimiter引数で行列要素の区切りに使用する文字列も指定できる。*3
        例: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コマンドでテキストファイルに書き出したデータが改行されません

ヘッダやテキスト付きCSVファイル読み込み

  • 例えば、文字列を含む filephoneTime.csv を読み込むとします。
    • 一列目は音素名、二列目・三列目は開始・終了時間
    • 以下を実行します。
       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
  • 続いて、一行目にヘッダを含む filephoneTime2.csv を読み込むとします。
    • 以下を実行します。
       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

グラフの書き出し

  • 参考(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」として保存されます。
    • サーバ上でグラフを作成するときなどに利用できます。
  • さらに参考 - 画像を取り込んで加工して出力する(画像処理で遊ぼう!)

WAVファイル読み込み

  • ファイルから取り込む
    • WAVREAD Microsoft WAVE (".wav")サウンドファイルの読み込み
      filename = '001.wav';                    %読み込むファイル名を指定
      [data,Fs,Bits] = wavread(filename);
    • dataには音声データ(列表記の振幅)、Fsにはサンプリング周波数、Bitsには量子化ビット数が代入されます。
    • 音声データとサンプリング周波数については、MATLAB勉強会第三回 で詳しく解説しています。
  • マイクで取り込む
    • WAVRECORD Windows オーディオ入力デバイスを使って、音声を録音
      Fs = 44100;
      time = 3;
      data  = wavrecord(time*Fs, Fs, 1);       %1chでtime秒間録音して、データをdataに格納

WAVファイル書き出し

  • WAVWRITE Microsoft WAVE (".wav")サウンドファイルへの書き出し
    filename = '002.wav';                    %書き出すファイル名を指定
    wavwrite(data, Fs, 16, filename);        %16 = 量子化ビット数
    • 量子化ビット数は、デジタルデータを作成するときの値の上限に関係します。とりあえず16にしておけば問題ないです。

XML


*1 以下、菊池研M君の報告から引用しました。ありがとう!
*2 参考:The MathWorks csvwriteについて
*3 参考:The MathWorks dlmwriteについて

添付ファイル: filephoneTime2.csv 2831件 [詳細] filephoneTime.csv 4676件 [詳細]