R12 Release Notes    

プログラミングとデータタイプの問題

関数名の評価

関数fevalは、関数ハンドルまたは関数名の文字列に対して利用することができます。関数ハンドルの評価は、関数名の評価に優先します。たとえば、関数humpsを評価する以下の2行のコードにおいて、2行目が優先して利用されるメカニズムです。

下位互換性をサポートするため、fevalは、関数名の文字列を第一引数として受け入れ、文字列内の関数を評価します。しかし、関数ハンドルを使うと、プログラミングとデータタイプの機能で説明した性能、信頼性、ソースファイルコントロールの利点を得ることができます。

feval, load, saveの引数名の長さ

MATLABにおけるほとんどの名前は、31文字で打ち切られます。旧バージョンでは、関数feval, load, saveに渡される引数については、そうではありませんでした。結果として、それらの関数に渡される名前が最初の30文字までが同一でその後が異なっていても、それらの名前を区別することが可能でした。

MATLAB 6.0では、feval, load, saveに渡される引数(ファイル名以外)は、最大31文字で打ち切られます。最初の31文字が同一である名前をコード内で利用する場合は、MATLABは関数内でそれらの名前を区別しません。

ファイル名は、この規則に従いません。MATLABは、任意長の名前をもつファイルを一意的に識別します。

M-コードの行の長さの制限の削除

M-コードの行の長さに対する制限はありません。

fevalは関数名のみを受け取ります

MATLABの旧バージョンでは、評価される関数の絶対パスを渡してfevalを呼び出すことができました。また、この方法を使ってサブ関数またはプライベート関数を直接呼ぶこともできました。たとえば、以下のコマンドは、ファイルsubfile内で定義されたサブ関数を実行します。

IMATLAB 6.0では、fevalは、単純に関数名のみを受け取ります。サブ関数およびプライベート関数をそれらの通常の範囲外で評価するためには、関数ハンドルを利用できます。

空の構造体フィールドの割り当て

構造体のフィールドに別の構造体を割り当てようとすると、以下の条件が共に真である場合には、エラーになります。

たとえば、

この演算は、旧バージョンのMATLABではエラーを出力しませんでした。

空の構造体フィールドの比較

文字列と構造体フィールドとの間での文字列の比較は、以下の条件がすべて真である場合は、エラーになります。

この操作は、MATLABの旧バージョンではエラーを出力しませんでした。

配列要素間にはセパレータが必要です

MATLAB 5では、ある条件下においては、2つ以上のセル配列要素、ベクトル、行列要素をカンマあるいは空白のようなセパレータテキストを使わずに表わすことが可能でした。たとえば、以下はすべて有効な表現でした。

MATLAB 6.0では、最初にM-ファイルをメモリにロードしたときにこの状況が検出された場合は、ワーニングを発生します。MATLABの将来のバージョンでは、エラーになる予定です。この状況を修復するには、セル配列要素、ベクトル、行列要素の間にカンマまたは空白を置いてください。

あるいは

のようにします。以下のコマンドは、上記の情報を表示します。

論理ANDおよびORの優先

MATLAB 6.0からは、論理AND (&) および論理OR (|)演算子の優先は、標準の関係に従います。ここでANDはORよりも高い優先度をもちます。この優先度は、SimulinkやStateflowたけでなく、ほとんどのプログラミング言語において実現されているブーリアン代数の正式な規則と一致します。

従来は、MATLABは以下の表現

を誤って扱っていました。

現在では以下のように正しく扱います。

新規の優先規則が得られる結果に影響を与える唯一のケースは、同じ表現(括弧なし)内で| が & の前にある場合です。たとえば、

MATLAB 5.3およびそれより前のバージョンでは、このステートメントは以下のように評価され、0でした。

MATLAB 6.0以降は、この表現は、以下のように評価され、1になります。

従来の解釈から新しい解釈に挙動を変更する表現に対してエラーを生成する機能がシステムに提供されています。


MATLABの関数breakは、forまたはwhileループの実行を終了します。forまたはwhileループが、try - catch内にbreakが置かれているtry - catchステートメントを含む場合は、break ステートメントはtry - catchではなくforまたはwhileループを終了します。

I以下の例では、breaktry - catchステートメントの中に置かれ、try - catchfor lループ内にあります。MATLAB 5では、breakの実行により、tryから行x = 5への誤った分岐が生じます。この場合forループは終了しません。

MATLAB 6.0では、try - catch内でのbreakの実行は、forループを終了します。breakに続いて実行される次の行は、y = 10です。

SETFIELDおよびGETFIELDを使ったフィールド名の指定

関数setfieldおよびgetfieldは、MATLAB構造体配列で指定されたフィールドの値を設定および取得します。MATLAB 5では、以下のドキュメントに記述されていないシンタックスを使ってfieldnに値newvalueを設定し、その値を読み込むことができました。

これらのシンタックスは、MATLAB 6.0ではサポートされません。代わりに以下を使ってください。

たとえば、以下のようになります。

構造体配列でのGETFIELDの利用

関数getfieldは、MATLAB構造体配列の指定したフィールドの内容を出力します。MATLAB 5では、単一のgetfieldの呼び出しにおいて複数の出力値を要求した場合にはエラーが発生しました。たとえば、以下のgetfield の呼び出しは、構造体配列aの3つすべての要素に対してxフィールドの内容を要求します。

MATLAB 6.0では、getfield から複数の出力値を要求すると、単一の出力値を出力し、エラーにはなりません。出力される値は、呼び出し内で要求されたすべての出力値のうちの最初の値です。上記の例で、getfieldは、(a,'x')を適用すると最初のフィールドである、a(1).x の内容を出力します。

要素に具体的にインデックス付けを行うことにより、他の構造体配列の内容を取得することができます。たとえば、

テンポラリ変数は、Anonymousです

セル配列の個々のセル、MATLAB構造体のフィールド、すべてのテンポラリ変数は、anonymousであることが保証されます。

たとえば、以下の関数は、myfunに渡される最初の入力引数名を出力します。

MATLAB 5では、eval('x')の値を渡すためのテンポラリ変数は変数名xを保持しました。MATLAB 6.0では、この変数はanonymousです。

この変更により、MATファイルの中にはサイズに少量の差が生じるものがあります。

関数computerにおけるプラットフォーム名の変更

UNIXプラットフォームの中には、MATLAB 6.0では関数computerによって出力される名前が変更されたものがあります。UNIXプラットフォーム上での特別な操作用に関数computerを利用するコードがある場合は、そのコードは、プラットフォーム名の変更のため異なる挙動をする場合があります。

プラットフォーム
6.0以前の文字列
MATLAB 6.0の文字列
Linux
LNX86
GLNX86
SGI
SGI
SGI (変更なし)
SGI64
SGI64
SGI
HPUX 11.x
HP700
HPUX
HPUX 10.20
HP700
HP700 (変更なし)

Linuxでのプロセスとメモリの使用量

Linuxでは、単純な作業を扱う場合にも多くのプロセスを起動することに気が付く場合があります。これらは、実際はスレッドですが、"スレッド毎に1プロセス"モデルのため、プロセスとして表わされます。Linuxでpsまたはtopコマンドを使ってシステムで実行中のプロセスを表示するとき、これらのスレッドが別々のプロセスとして表示されることがわかります。

アプリケーション用に多数のスレッドを作成することは、Linuxでは珍しいことではありません。AWTを利用する簡単なJavaプログラムやネイティブなスレッドでさえ、Linuxでは9個のスレッドを作成します。

また、各スレッドによって用いられるメモリの量と割合も表示されます。MATLABによって起動されたスレッドによって利用されるメモリは、スレッド間で共有されることに気付きます。この表示の各スレッドのメモリ消費量は、実際にすべてのMATLABスレッドが利用するメモリの総量を現します。

廃版関数

以下のMATLAB関数は、名前が変更されているかあるいは廃版になっています。下位互換性のため、今回は削除されていません、しかし、これらの関数は、将来のリリースで削除される予定なので、関数の利用を中止するか、それらの代替関数を利用することを推奨します。

関数
詳細
errortrap
try ... catchに変更されています。
flops
浮動小数点操作のカウント。0を出力します。
fmin
1変数関数を最小化します。fminbndに変更されています。コードを変換するためには、MATLABドキュメントの"ファンクション関数"の指示を参照してください。
fmins
多変数関数を最小化します。fminsearchに変更されています。コードを変換するためには、MATLABドキュメントの"ファンクション関数"の指示を参照してください。
foptions
最適化ルーチンが利用するデフォルトパラメータ。optimget, optimsetに変更されています。コードを変更するためには、MATLABドキュメントの"ファンクション関数"の指示を参照してください。
interp4, interp5, interp6
2次元データ内挿。代わりにinterp2を使ってください。
isdir
existに変更されています。
isieee
IEEE演算マシン上では真 (1) を、IEEE演算マシンでない場合は偽(0) を出力します。現在は、すべての場合で1を出力します。
isstr
ischarに変更されています。
meshdom
3次元プロットに対してXおよびY配列を生成します。代わりにmeshgridを使ってください。
nnls
非負最小二乗。lsqnonnegに変更されています。コードを変換するには、MATLABドキュメントの"ファンクション関数"の指示を参照してください。
quad8

数値積分。quadlに変更されています。

saxis

音声の軸のスケーリング。soundの出力に影響を与えません。

setstr
charに変更されています。
str2mat
charに変更されています。
table1

1次元テーブルルックアップ。代わりにinterp1を使ってください。

table2

2次元テーブルルックアップ。代わりにinterp2を使ってください。

関数errortrapは利用できませんが削除されていません

関数errortrapは利用できませんが削除されていません 組み込み関数errortrapは、MATLAB 6.0では廃止されています。これは利用できませんが、下位互換性の目的のため削除されていません。

常微分方程式(ODE)問題の指定

ODEファイルによってソルバに渡されたODE問題の成分は、引数として直接渡されるか、あるいは、オプション構造体で指定する必要があります。新規のシンタックスは以下の通りです。

ここで、 odefun, tspan, y0は必須の引数です。詳細は、ODEソルバおよびodesetリファレンスページを参照してください。

MATLAB 6.0は、下位互換性のためODEファイルの利用をサポートしますが、新機能は新規のシンタックスでのみ利用することができます。

バックグランドおよびフォアグランドコマンドからの出力(UNIX)

Release 12は、UNIXプラットフォームでは、以下のようなバックグランドコマンド &を後に付けたシステムコマンド)

は、出力を生成しません。Release 12より前では、バックグランドコマンドはコマンドウィンドウに出力を送りました。

コマンドからの出力を見たい場合は、コマンドをバックグランドコマンドにしない(&)を取り除く)か、あるいは、バックグランドコマンドを別のxtermで実行してください。別のxtermを起動するには、以下のコマンドを実行します。

Release 12では、フォアグランド関数(非バックグランド関数)は、関数diaryが実行されている場合は出力をダイアリに送ります。出力は、コマンドウィンドウにも表示されます(Release 12より以前は、フォアグランド関数の出力は、コマンドウィンドウに表示されるだけでした)。

matlab_helperの処理

!およびunix コマンドをより効率的に操作するために、Release 12ではMATLABは起動時にmatlab_helperと呼ばれる二次プロセスを作成します。

このmatlab_helperは、!およびunixコマンドの実行に必要なMATLABの要素を含みます。


開発環境の問題 外部インタフェース/APIの問題