手書きのデータなどから数値を入力したり、表にして印刷したりするには、Excelなどの表計算ソフトの方が圧倒的に便利です。そこで、Excelなどとファイル互換性のあるCSV形式(カンマ区切りのテキストファイル)でファイルを読み書きすれば、「Excelで入力→FreeMatで計算→Excelで表示」といった分業ができます。
CSVファイルの読み取りには「csvread」コマンドを、書き込みには、「csvwrite」コマンドを用います。csvreadヘルプとcsvwriteヘルプの一部を下記に示します。
The csvread function reads a text file containing comma separated values (CSV), and returns the resulting numeric matrix (2D). The function supports multiple syntaxes. The first syntax for csvread is x = csvread('filename') which attempts to read the entire CSV file into array x.
意味は「csvreadコマンドは、CSV形式のテキストファイルを読み取り、数値配列を返します。x = csvread('filename')とすると、filenameで示したCSVファイルを読み取り、変数xに格納します」ということです。
The csvwrite function writes a given matrix to a text file using comma separated value (CSV) notation. The syntax for csvwrite is csvwrite('filename',x) where x is a numeric array.
こちらの意味は「csvwriteコマンドは、配列をCSV形式のテキストファイルにして保存します。csvwrite('filename',x)とすると、配列変数xをfilename名のCSVファイルとして保存します」ということです。
まず、Excelなどの表計算ソフトで、下記のような2行10列の表を作成します。
次に、ファイル名をsample.csvとしてcsv形式で保存します。csv形式での保存は、「メニューバー→名前を付けて保存」とすると、図1のダイアログが現れるので、ダイアログのファイルの種類でドロップボックスをクリックして、CSV(カンマ区切り)を選択します。
ファイル名をsampleと入力して、FreeMatのカレントフォルダに保存します。
FreeMatのコマンドウィンドウで、x=csvread('sample.csv');と入力すると、表1のデータが変数xに格納されます。試しに、plot(x(1,:),x(2,:))と入力してみると、図2のように、1〜10に変化する右下がりの直線となり、正しく読み込まれていることが分かります。FreeMatはグラフプロットが得意なので、要素数の多いデータの確認はグラフ化して確認すると便利です。
次に、csvwriteを試してみましょう。コマンドウィンドウでy=[1:10;10:-1:1]と入力すると、下記のように、1〜10まで変化する2行10列の変数yができます。
コマンドウィンドウでcsvwrite('sample_y.csv',y)とすると、カレントフォルダにsample_y.csvというファイルができます。sample_y.csvをExcelなどで開いてみると、図3に示すように、変数yの内容が保存されていたことが分かります。
例として、CSV形式のデータをFreeMatで読み取り、3次元プロットを作成する関数mファイルを作成してみます。例えば、表2に示すような実験結果が得られたとします。1行目はx座標で、1列目はy座標です。位置x,yでの測定結果は2行2列目以降の要素です。
これをExcelの等高線グラフで作成すると、図4のようなグラフを作成することは可能ですが、手間が掛かります。また、x、y軸の数値は単なるラベルで、x、yの間隔が不均一なものは正しく表現できません。
そこで、CSV形式に保存したデータを読み取って、自動で3次元プロットを行う関数mファイルex315.mを作成してみました。
function ex315(s) data=csvread(s); xy=size(data); x=data(1,2:xy(2)); y=data(2:xy(1),1); z=data(2:xy(1),2:xy(2)); xx=repmat(x,length(y),1); yy=repmat(y,1,length(x)); surf(xx,yy,z); view(3); grid('on');
ex315.mをカレントフォルダやパスの設定されたフォルダに保存し、コマンドウィンドウでex315('table.csv')と入力すると、table.csvファイルを読み取り、図5に示す3次元プロットを行います。
ex315.mでは、引数sからcsvreadコマンドでファイルを読み取ります。本格的なソフトであれば、ファイルが存在しない場合のエラー処理が必要となりますが、ここでは省略しています。読み取ったデータは「data」という変数に格納します。次に「size」コマンドでdataの要素サイズを求め、変数xyに格納します。変数xはdataの1行目の2列〜要素列サイズのデータで、変数yはdataの2行目〜要素行サイズのうちの1列目のデータです。変数zは2行目、2列目からdata要素サイズまでの配列です。変数x、y、zとして、以上のデータを配列dataから取り出します。
次に、グラフィックス編でも説明したように、3次元グラフではグラフ変数に同じ大きさの配列要素が必要となります。そこで、x軸、y軸用のデータとして、コマンドrepmatを用いてデータを作成します。repmat(x,m,n)は、変数xをm行n列コピーして、新たな配列を作成します。x軸用のデータであれば、xx=repmat(x,length(y),1);として、変数xを変数yの長さ分だけ行方向に並んだ配列xxを作成します。
また、y軸用のデータは、yy=repmat(y,1,length(x));として、変数yを変数xの長さ分だけ列方向に並んだ配列yyを作成します。最後に、surf(xx,yy,z);として、グラフをプロットします。
コマンドウィンドウでex315('table.csv')とすると、図5に示す3次元プロットが得られます。ここで、CSVファイルの保存場所とカレントフォルダとが異なっていると、Error: filename table.csv could not be openedとなりますので注意してください。
さて、ex315('table.csv')を入力しても、グラフは作成されますが、Variablesウィンドウには変数が表示されません。これは、ex315.mは戻り値を持たず、関数mファイル内の変数がローカル変数のためです。従って、変数x、y、zをプロット後に再利用したい場合は、ex315.mで1行目を下記のように変えて、変数zzへの戻り値を指定して、データをワークスペースに受け渡します。
function zz=ex315(s)
次に最終行に下記を追加し、zzは変数x、y、zのセル配列とします。
zz={x,y,z};
コマンドウィンドウでzz=ex315('table.csv');と入力すると、セル配列zzができます。変数x、y、zは下記のように、セル配列zzの要素番号を指定することで得られます。
x=zz{1}; y=zz{2}; z=zz{3};
◇
次回は、基本的なアルゴリズムをFreeMatの関数で実現する方法を説明します。
伊藤孝宏(いとう・たかひろ)
1960年生。小型モーターメーカーのエンジニア。博士(工学)。専門は流体工学、音・振動工学。現在は、LabVIEWを使って、音不良の計測・診断ソフト、特性自動検査装置などの開発を行っている。
Copyright © ITmedia, Inc. All Rights Reserved.