Matlab/Octave関連情報

■ 書籍出版 (1 Nov 2016)

MATLAB初心者向けの書籍を出版しました. 「はじめてのMATLAB」(近代科学社)です.このページにあるような情報をより丁寧にまとめましたので,よろしければお試しください.Kindle版もあります.


■ GUIプログラムの戻り値(11 June 2008)

このページにもいくつか例を挙げていますが、この数年MatlabのGUIDEでGUIプログラムを作ることが多いです。 その間ずっと解決できていないことがありました。 それは、GUIプログラムを他のプログラムやコマンドラインから呼び出したときに、 戻り値を返す方法です。

例えば、文字を入力し、クローズボタンでプログラムを終了するようなGUIプログラムを考えます。

戻り値を返したいときには、OpeningFcnで、

uiwate(handles.figure1);
のコメントを外します。 これによって、当該のGUIプログラムが終了するまで、戻り値の出力をしないようになります。(逆に、この行がコメントアウトされていると、当該のGUIプログラムが起動したとたんに戻り値が返されてしまって意味をなさない)。

OutputFcnにはもともと

varargout{1} = handles.output;
という行があるので、プログラムの中でhandles.outputの中身を書き換えたり、
varargout{1} = handles.text;
のように別の変数を与えたり、
varargout{1} = handles.output;
varargout{2} = handles.text;
のように戻り値を増やしたりすればいいわけです。 ここまでは見当がついていたのですが、問題はこの後です。

クローズボタンをクリックしたときにプログラムを終了させるわけですから、 私の感覚ではクローズボタンのコールバックにcloseを入れるものだと信じていました。 実際、戻り値を返さなければこのプログラムはちゃんと機能します。 このようにした上で、プログラムを実行すると、 「OutputFcnでhandlesがない」とエラーが出ます。消した覚えもないのに。 uiresume()をあちこちに入れてみても解決しません。

わけもわからず何ヶ月かほったらかしにしていたのですが、 どうしてもこの問題を解決しなければならなくなり、 Matlab CentralやGoogle groupsで調べまくりました。 その結果、ようやくクローズボタンのコールバックではcloseしてはならないことに気づきました。 クローズボタンのコールバックではuiwait()を呼び出すだけにしておいて、 以降の処理をOutputFcnに渡します。 OutputFcnではhandlesの値をvarargoutにコピーし、 その後でcloseを呼び出すのです。 こうすれば、handlesが消えてしまうこともなく、戻り値が返ってきます。

クロースボタンのコールバックでcloseを呼んでしまうと、そこでhandlesも消えてしまうらしいのです。 仕様と言われればそれまでですが、そりゃ気づきにくいよなぁと感じるのは私だけでしょうか。

参考まで、以下にサンプルプログラムを置いておきます。


■ wavplayコマンド(08 June 2006)

音を出すにはsoundコマンドを使っていました。しかし、

 >> sound(snd1,fs); sound(snd2,fs);
としたとき音が重なるので困っていました。そんなとき、Matlabのサポートの方 にwavplay というコマンドがあるのを教えていただきました。このコマンドは音 が終わってから次のコマンドが実行されます。感謝。


■ GUIDEの解説 (Dec. 21 2004)

GUIDEの解説に用いたスライドとサンプルプログラムです。


■ 3次元MRIを表示するプログラム (03 Oct. 2004)

02 Dec. 2009追記:プログラムのバグを修正しました。長らくすみませんでした。

3次元MRIを3面で表示するシンプルなプログラムです。マウスのドラッグに追従 して表示面を変える機能を持っています。MRIを利用した研究に役立てば幸いで す。

simple_mpr

このプログラムは、次のような動作をします。

Windows上のMatlab R13で作成しました。表示倍率を指定する機能や、任意断面 を表示する機能などを自分で追加してみると面白いと思います。

ダウンロードはこちらから。lzhで圧 縮してあります。ダウンロードしてlzhファイルを展開すると、simple_mprとい うフォルダができます。それをMatlabのパスの通ったところに置いて(もしくは simple_mprフォルダにパスを通して)、Matlabのコマンドラインから

  >> simple_mpr
と実行します。


■ DICOMファイルを取り扱うGUIプログラム

MatlabのImage Processing Toolboxには、医用画像の標準的フォーマットDICOM 形式のファイルを取り扱うコマンドが用意されています。dicominfoやdicomread です。これらのコマンドを利用して、DICOMファイルを取り扱うプログラムを 作りました。MRIを利用した研究に役立てば幸いです。

なお、このプログラムのオリジナルは 竹本さんがC++で作られ たプログラムです。

dicomviewer

このプログラムは、次のような動作をします。利用にはImage Processing Toolboxが必要です。

Windows上のMatlab R13で作成しました。

ダウンロードはこちらから。 lzhで圧縮してあります。 ダウンロードしてlzhファイルを展開すると、dicomviewerというフォルダができ ます。それをMatlabのパスの通ったところに置いて(もしくはdicomviewerフォ ルダにパスを通して)、Matlabのコマンドラインから

  >> dicomviewer
と実行します。


■ GUIDEを使った小さなプログラム

Matlab上のGUIプログラム作成ツールであるGUIDEを使って小さなプログラムを作っ てみました。エラー処理などは不完全ですが、単純な分だけGUIDEを使うときの 参考になる点があるかもしれません。

1. tv (tiffviewer)

3次元MRIで撮像した画像データは、それぞれのスライスごとにファイルとして 保存されます。私はMRIで撮像した画像をTIFFファイルとして取り扱うことが多 いので、フォルダ内のTIFFファイルを表示するためのプログラムを作ってみまし た。FileメニューのSet dirで、画像の入っているフォルダを選択して、その中 にあるTIFFファイルを表示させるという単純なものです。Matlab上のツールであ るGUIDEを使ったので、数時間で作ることができました。

tiffviewer

このプログラムは、次のような動作をします。

なお、これはWindows上のMatlab R13で作成しました。いろいろ拡張しどころが あると思います。

ダウンロードはこちらから。lzhで圧 縮してあります。ダウンロードしてlzhファイルを展開すると、tiffviewerとい うフォルダができます。それをMatlabのパスの通ったところに置いて(もしくは tiffviewerフォルダにパスを通して)、Matlabのコマンドラインから

  >> tv
と実行します。

2. nozomi

台風の影響で新幹線のぞみに閉じ込められたときにベースを作った音声分析ツー ルです。スペクトログラムの表示にSpeech Processing Toolkitを使っています。 本当は、音声波形のプロット内にある緑のラインをpickして分析位置(時刻)の指 定をすれば使い易いのですが、手抜きをしてスライダーを使っています。また、 分析窓も(私が普段使う)Hanningのみとなっています。Closeするときディスプレ イ中の位置とサイズを記録して、次に起動する時に位置とサイズを再現するよう にしています。

nozomi

ダウンロードはこちらから。lzhで圧縮してありま す。ダウンロードしてlzhファイルを展開すると、nozomiというフォルダができ ます。それをMatlabのパスの通ったところに置いて(もしくはnozomiフォルダに パスを通して)、Matlabのコマンドラインから

  >> nozomi
と実行します。


■ Matlab ver. 5.x用ガイド

以前、学生向けに書いたMatlab/Octaveの解説です。MatlabがJavaベースになる 前のver. 5.3を対象にして書いていますので、今となってはGUI周りの記述がすっ かり古くなってしまいました。

しかし、Matlabはコマンドラインで使うべし、Matlabは高過ぎるからOctaveを使 うんだという硬派な方にはお役に立つかもしれません。(私も金銭的理由からだ いぶOctaveのお世話になりました)

このテキストはプログラミングの経験がない方、高度な数学的処理を必要としな い方を対象にして書いています。どなたかのお役に立てるかもしれませんので、 Octaveの開発にかかわる皆様、このテキストにコメントをいただいた皆様に感謝 しつつ、ここに掲載いたします。

第7章で終わりです。



Last update on Nov. 1 2016.
copyright © 2007-2016 Tatsuya Kitamura / All rights reserved.