R12 Release Notes | ![]() ![]() |
関数名の評価
関数feval
は、関数ハンドルまたは関数名の文字列に対して利用することができます。関数ハンドルの評価は、関数名の評価に優先します。たとえば、関数humps
を評価する以下の2行のコードにおいて、2行目が優先して利用されるメカニズムです。
feval('humps', 0.5674); % 関数名の文字列を使用 feval(@humps, 0.5674); % 関数ハンドルを使用
下位互換性をサポートするため、feval
は、関数名の文字列を第一引数として受け入れ、文字列内の関数を評価します。しかし、関数ハンドルを使うと、プログラミングとデータタイプの機能で説明した性能、信頼性、ソースファイルコントロールの利点を得ることができます。
feval, load, saveの引数名の長さ
MATLABにおけるほとんどの名前は、31文字で打ち切られます。旧バージョンでは、関数feval
, load
, save
に渡される引数については、そうではありませんでした。結果として、それらの関数に渡される名前が最初の30文字までが同一でその後が異なっていても、それらの名前を区別することが可能でした。
MATLAB 6.0では、feval
, load
, save
に渡される引数(ファイル名以外)は、最大31文字で打ち切られます。最初の31文字が同一である名前をコード内で利用する場合は、MATLABは関数内でそれらの名前を区別しません。
ファイル名は、この規則に従いません。MATLABは、任意長の名前をもつファイルを一意的に識別します。
M-コードの行の長さの制限の削除
fevalは関数名のみを受け取ります
MATLABの旧バージョンでは、評価される関数の絶対パスを渡してfeval
を呼び出すことができました。また、この方法を使ってサブ関数またはプライベート関数を直接呼ぶこともできました。たとえば、以下のコマンドは、ファイルsubfile
内で定義されたサブ関数を実行します。
feval('subfile/mysubfunction')
IMATLAB 6.0では、feval
は、単純に関数名のみを受け取ります。サブ関数およびプライベート関数をそれらの通常の範囲外で評価するためには、関数ハンドルを利用できます。
空の構造体フィールドの割り当て
構造体のフィールドに別の構造体を割り当てようとすると、以下の条件が共に真である場合には、エラーになります。
mystruct.emptyfield = []; mystruct.emptyfield(1) = struct('f1', 25); ??? Conversion to double from struct is not possible.
この演算は、旧バージョンのMATLABではエラーを出力しませんでした。
空の構造体フィールドの比較
文字列と構造体フィールドとの間での文字列の比較は、以下の条件がすべて真である場合は、エラーになります。
strcmp
内で参照される。mystruct.field1 = struct('field2',{}); strcmp('string', mystruct(1).field1.field2); ??? Error using ==> strcmp Not enough input arguments.
この操作は、MATLABの旧バージョンではエラーを出力しませんでした。
配列要素間にはセパレータが必要です
MATLAB 5では、ある条件下においては、2つ以上のセル配列要素、ベクトル、行列要素をカンマあるいは空白のようなセパレータテキストを使わずに表わすことが可能でした。たとえば、以下はすべて有効な表現でした。
[[1][2]] % [ 1 2 ]と等価 ['hello'sprintf(' world')] % [ 'hello world' ]と等価 {{1}fft(2)} % { {1} 2 }と等価
MATLAB 6.0では、最初にM-ファイルをメモリにロードしたときにこの状況が検出された場合は、ワーニングを発生します。MATLABの将来のバージョンでは、エラーになる予定です。この状況を修復するには、セル配列要素、ベクトル、行列要素の間にカンマまたは空白を置いてください。
[[1],[2]] ['hello',sprintf(' world')] {{1},fft(2)}
[[1] [2]] ['hello' sprintf(' world')] {{1} fft(2)}
help matrix_element_separators
注意 M-ファイルでのシンタックスチェックの実行では、M-ファイル内で失われた要素セパレータの位置をどうやって知るかについて説明しています。 |
論理ANDおよびORの優先
MATLAB 6.0からは、論理AND (&) および論理OR (|)演算子の優先は、標準の関係に従います。ここでANDはORよりも高い優先度をもちます。この優先度は、SimulinkやStateflowたけでなく、ほとんどのプログラミング言語において実現されているブーリアン代数の正式な規則と一致します。
y = a&b | c&d
y = (((a&b) |c) &d);
y = (a&b) | (c&d);
新規の優先規則が得られる結果に影響を与える唯一のケースは、同じ表現(括弧なし)内で| が & の前にある場合です。たとえば、
y = 1 | x & 0;
MATLAB 5.3およびそれより前のバージョンでは、このステートメントは以下のように評価され、0でした。
y = (1 | x) & 0;
MATLAB 6.0以降は、この表現は、以下のように評価され、1になります。
y = 1 | (x & 0);
従来の解釈から新しい解釈に挙動を変更する表現に対してエラーを生成する機能がシステムに提供されています。
feature('OrAndError', 0) % 挙動が変更された表現に対して % ワーニング(デフォルト) feature('OrAndError', 1) % 挙動が変更された表現に対して % エラー
MATLABの関数break
は、for
またはwhile
ループの実行を終了します。for
またはwhile
ループが、try
- catch
内にbreak
が置かれているtry
- catch
ステートメントを含む場合は、break
ステートメントはtry
- catch
ではなくfor
またはwhile
ループを終了します。
I以下の例では、break
は try
- catch
ステートメントの中に置かれ、try
- catch
はfor
lループ内にあります。MATLAB 5では、break
の実行により、try
から行x = 5
への誤った分岐が生じます。この場合for
ループは終了しません。
MATLAB 6.0では、try
- catch
内でのbreak
の実行は、for
ループを終了します。break
に続いて実行される次の行は、y = 10
です。
for i = 1:10 try <statement> break catch <statement> end x = 5 % MATLAB 5ではここにブレイク end y = 10 % MATLAB 6.0ではここにブレイク
SETFIELDおよびGETFIELDを使ったフィールド名の指定
関数setfield
およびgetfield
は、MATLAB構造体配列で指定されたフィールドの値を設定および取得します。MATLAB 5では、以下のドキュメントに記述されていないシンタックスを使ってfieldn
に値newvalue
を設定し、その値を読み込むことができました。
setfield(structurename.field1.fieldn,newvalue) getfield(structurename.field1.fieldn)
これらのシンタックスは、MATLAB 6.0ではサポートされません。代わりに以下を使ってください。
setfield(structurename,'field1','fieldn',newvalue) getfield(structurename,'field1','fieldn')
a.b.c = 7; a = setfield(a,'b','c',10); getfield(a,'b','c') ans = 10
構造体配列でのGETFIELDの利用
関数getfield
は、MATLAB構造体配列の指定したフィールドの内容を出力します。MATLAB 5では、単一のgetfield
の呼び出しにおいて複数の出力値を要求した場合にはエラーが発生しました。たとえば、以下のgetfield
の呼び出しは、構造体配列a
の3つすべての要素に対してx
フィールドの内容を要求します。
a(1).x=5; a(2).x=12; a(3).x=27; getfield(a,'x')
MATLAB 6.0では、getfield
から複数の出力値を要求すると、単一の出力値を出力し、エラーにはなりません。出力される値は、呼び出し内で要求されたすべての出力値のうちの最初の値です。上記の例で、getfield
は、(a,'x')
を適用すると最初のフィールドである、a(1).x
の内容を出力します。
getfield(a,'x') ans = 5
要素に具体的にインデックス付けを行うことにより、他の構造体配列の内容を取得することができます。たとえば、
getfield(a,{3},'x') ans = 27
テンポラリ変数は、Anonymousです
セル配列の個々のセル、MATLAB構造体のフィールド、すべてのテンポラリ変数は、anonymousであることが保証されます。
たとえば、以下の関数は、myfun
に渡される最初の入力引数名を出力します。
function myfun(a) inputname(1)
MATLAB 5では、eval('x')
の値を渡すためのテンポラリ変数は変数名x
を保持しました。MATLAB 6.0では、この変数はanonymousです。
x = [1 2 3]; myfun(eval('x'')) % RMATLAB 5では ... x % 出力はxです。 myfun(eval('x'')) % MATLAB 6.0では ... '' % 出力は''です。
この変更により、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 |
数値積分。 |
saxis |
音声の軸のスケーリング。 |
setstr |
char に変更されています。 |
str2mat |
char に変更されています。 |
table1 |
1次元テーブルルックアップ。代わりに |
table2 |
2次元テーブルルックアップ。代わりに |
関数errortrapは利用できませんが削除されていません
関数errortrapは利用できませんが削除されていません
組み込み関数errortrap
は、MATLAB 6.0では廃止されています。これは利用できませんが、下位互換性の目的のため削除されていません。
常微分方程式(ODE)問題の指定
ODEファイルによってソルバに渡されたODE問題の成分は、引数として直接渡されるか、あるいは、オプション構造体で指定する必要があります。新規のシンタックスは以下の通りです。
solver
(@odefun,tspan,y0,options,p1,p2,...)
ここで、 odefun
, tspan
, y0
は必須の引数です。詳細は、ODEソルバおよびodeset
リファレンスページを参照してください。
MATLAB 6.0は、下位互換性のためODEファイルの利用をサポートしますが、新機能は新規のシンタックスでのみ利用することができます。
バックグランドおよびフォアグランドコマンドからの出力(UNIX)
Release 12は、UNIXプラットフォームでは、以下のようなバックグランドコマンド &
を後に付けたシステムコマンド)
! cat startup.m &
は、出力を生成しません。Release 12より前では、バックグランドコマンドはコマンドウィンドウに出力を送りました。
コマンドからの出力を見たい場合は、コマンドをバックグランドコマンドにしない(&
)を取り除く)か、あるいは、バックグランドコマンドを別のxtermで実行してください。別のxtermを起動するには、以下のコマンドを実行します。
! xterm &
Release 12では、フォアグランド関数(非バックグランド関数)は、関数diary
が実行されている場合は出力をダイアリに送ります。出力は、コマンドウィンドウにも表示されます(Release 12より以前は、フォアグランド関数の出力は、コマンドウィンドウに表示されるだけでした)。
matlab_helperの処理
!
およびunix
コマンドをより効率的に操作するために、Release 12ではMATLABは起動時にmatlab_helper
と呼ばれる二次プロセスを作成します。
このmatlab_helper
は、!
およびunix
コマンドの実行に必要なMATLABの要素を含みます。
![]() | 開発環境の問題 | 外部インタフェース/APIの問題 | ![]() |