MATLAB Release Notes    

プログラミングとデータタイプのアップグレードの問題

MATLAB 6.1 からMATLAB 6.5 へのアップグレードの問題は、プログラミングとデータタイプの機能については、以下で説明します。MATLAB 6.5 は、既存のプログラムに影響を与える可能性があるMATLABの内部構造への重要な変更を行っています。変更点を以下に示します。

ワーニングコントロールのアップグレードの問題

プログラム内で選択したワーニングの取り扱い方法に関する情報は、Release Notesのワーニング制御機能を参照してください。

機能の変更.   これらのワーニングコントロールの変更には、現在コードに存在するワーニングステートメントに影響を与えるものがある場合があります。つぎの2つの表は、MATLAB 6.0 および 6.5 がどのようにMATLAB 6.0 のワーニングシンタックスに対応するかを示しています。

つぎの表は、MATLAB 6.0 の挙動を示します。

MATLAB 6.0 のシンタックス
MATLAB 6.0 の挙動
warning backtrace
warning on all; enable backtraces
warning backtrace off
warning on all; disable backtraces
warning backtrace on
warning on all; enable backtraces
warning off backtrace
warning on all; disable backtraces
warning on backtrace
warning on all; enable backtraces
warning debug
warning on all; dbstop if warning
warning debug off
warning on all; dbclear if warning
warning debug on
warning on all; dbstop if warning
warning off debug
warning on all; dbclear if warning
warning on debug
warning on all; dbstop if warning
warning once
warning once ... each-HG-back-compat-message-identifier
warning always
warning always ... each-HG-back-compat-message-identifier
warning
ans は、on, off, debug, backtraceのいずれかになります。
s = warning(...)
s は、on, off, debug, backtraceのいずれかになります。
入力は(存在する場合は)上記のように処理されます
[s, f] = warning(...)
s は、on, off, debug, backtraceのいずれかになります。
f は、onceまたはalwaysのいずれかになります。
入力は(存在する場合は)上記のように処理されます

これは、MATLAB 6.0 においては、コマンドwarning onceによって影響を受ける Handle Graphics下位互換ワーニングメッセージです。

下位互換性のため、MATLABは上記の表の左列にあるwarningのすべての利用が可能です。しかし、変更の中には、下記の表のように実際の挙動に対して行われるものがあります。

つぎの表は、MATLAB 6.0 warningコマンドシンタックスに応じたMATLAB 6.5 の挙動を示します。

MATLAB 6.0 シンタックス
MATLAB 6.5 の挙動
warning backtrace
enable backtraces
warning backtrace off
disable backtraces
warning backtrace on
enable backtraces
warning off backtrace
disable backtraces
warning on backtrace
enable backtraces
warning debug
dbstop if warning
warning debug off
dbclear if warning
warning debug on
dbstop if warning
warning off debug
dbclear if warning
warning on debug
dbstop if warning
warning once
Warning - ワーニングの頻度はサポートされません。
warning always
Warning - ワーニングの頻度はサポートされません。
warning
warning query all; ansに割り当てられません。
s = warning(...)
s = warning('query', 'all');
then process inputs (if any) as above.
[s, f] = warning(...)
Warning - ワーニングの頻度はサポートされません。

ワーニングによる出力.   MATLAB 6.5 より以前では、warningは、最大で2つの出力、statefrequencyを出力しました。これらは、どちらも現在は意味がありません。また、出力する単一のワーニング状態や単一のワーニングの頻度でもありません。

frequency出力は利用できません。MATLABはこの出力が要求された場合がワーニングを生成します。

関数warningは、state出力に対する文字列の代わりに構造体を出力します。この出力を利用する既存のコードは、通常のように機能し続けますが、state値がこの新しいコンテキストで適切に解釈されていることを確認するために、調べてみるべきです。

書式付きのエラーおよびワーニング文字列

下位互換性のため、1入力のみがerrorまたはwarningに渡される場合が、MATLABは書式付き文字列ではなく固定文字列として扱います。MATLABドキュメントの"Errors and Warnings"のFormatted String Conversionを参照してください。

getfieldおよびsetfieldの置換

getfieldおよびsetfieldに対するダイナミックなフィールド名の改良により、これらの2つの関数は、最終的にはMATLAB言語から削除される予定です。MATLAB 6.5 では、getfieldおよびsetfieldは、ダイナミックなフィールド名の利用を推奨するワーニングメッセージを生成します。詳細については、構造体に対するダイナミックなフィールド名を参照してください。

breakでの新規挙動

関数breakは、forまたはwhileループ内で用いられることを意図しています。ループの外でbreakを利用すると、ワーニングが発生します。

isequalと構造体のフィールド作成の順番

isequalを使って構造体を比較する際、MATLABは構造体のフィールドが同等であることを確定する際に順番を考慮しません。isequalリファレンスページの例題2を参照してください。

logical属性はクラスになっています

従来のバージョンのMATLABでは、logicalは数値データタイプの属性でした。これは、つぎの例で説明されています(MATLAB 6.1 で実行)。ここで、b = a > 10logical属性をもつdouble arrayを生成します。

MATLAB 6.5 では、logicalはfirst classデータタイプかつMATLABクラスです。下記のクラス階層図は、logicalがクラスであり、キャラクタやセル配列のような他のfirstクラスタイプと等価であることを示します。

同じ例題をMATLAB 6.5 で実行すると、クラスlogical arrayの結果を生成します。

関連する関数への影響.   以下の表は、logicalタイプについて実行される多くの関数から得られる結果を比較しています。表の変数aは、つぎのように得られます。

有効な論理値.   logicalsは、値01のみをもつことができます。0または1以外の実数有限値を論理値に変換するときは、MATLABは、それらに論理値1を与えて、ワーニングメッセージを出力します。

islogicalの挙動は変更されません.   上記の表において、islogicalは、従来のリリースにおいてはlogical属性をもつ配列に対して行ったように、logical配列に対して1を出力します。

配列操作.   すべての一般的な配列操作関数(例 サブスクリプト、リファレンス、割り当て、連結、size, length, numel, ndims, permute, diag等)は、本節に記述した挙動に関しては、MATLAB 6.0 と同様に機能します。

Boolean関数.   すべてのBoolean関数(例., and, or, not, xor, any, all)は、本節に記述した挙動に関しては、MATLAB 6.0 と同様に機能します。

MAT-ファイル.   logical配列を含む、MATLABの旧バージョンで作成されたM-ファイルは、MATLAB 6.5 では正常にロードされます。0および1以外の値は、1に変換されます。logical属性をもつdouble配列は、MATLAB 6.5 でロードされたときは、logical配列になります。

混合モードの演算.   混合モードの演算(例 logicaldoubleを含む演算)は、非logicalデータタイプに対して登録された関数をディスパッチします。logicalは、そのタイプに変換され、演算が進行します。この挙動は、MATLAB 6.0 での機能との下位互換性があります。

logicalをdoubleに変換.   関数doubleを使って、logical配列をdouble配列に変換することができます。

インデックス付きの割り当て.   MATLABのデータタイプは、規則としてインデックス付きの割り当てに対して予約されています。これは、現在はMATLABデータタイプであり、logicalに対して正しいものです。

つぎの例は、タイプlogicalの空配列を作成します。(a(1) = 1)の後のdoubleのインデックス付き割り当ては、タイプをdoubleに変換しません。logicalタイプは保存されます。

NaNまたは複素数値を関数logicalに渡す.   NaNまたは複素数値をifまたはwhileステートメントに渡すか、あるいはand, or, not, logicalに渡そうとすると、常にエラーを出力します。

'truth'の定義の変更

MATLABの進化とともに、truth の定義は複雑で矛盾したものになっています。MATLAB 6.5 の1つの目的は、すべての状況で適用されるtruthの簡単で一貫性のある定義を示すことです。

この変更は、次のタイプの操作に影響を与えます。

空配列と空配列またはスカラを比較.   MATLABは、2つの0行0列空配列を比較したり、あるいは、0行0列空配列をスカラと比較するときに空配列([]) を出力します。この挙動は、ifwhileステートメント内で実行される比較にも影響を与えます。

2つの0行0列の空配列の比較:

0行0列の空配列をスカラと比較:

この挙動は、その他のすべてのバイナリ演算子について一貫しています(例 >, <, ~=, +, -, .*, 等)。

空配列をスカラと比較.   MATLABは、0行0列空配列とサイズのある配列を比較するときに、dimension mismatchエラーを出力します。

anyまたはallと共にNaNを利用   関数anyおよびallは、NaNを無視します。そのため、anyNaNを唯一の非ゼロ要素としてもつベクトルに対して0を出力します。allの挙動は、この変更による影響を受けませんが、anyallminmaxのようなその他のreduction演算子と同様に機能することを意味します。

オブジェクトとの相互作用.   従来のバージョンのMATLABでは、ユーザ定義オブジェクトを引数としてifまたはwhileに渡すと、インタプリタは、truth が決定されているものに変換するために、(存在する場合は)オブジェクトのdoubleメソッドを呼び出しました。MATLAB 6.5 は、この状況を、最初にオブジェクトのlogicalメソッドを探し、見つからない場合には(存在する場合は)doubleメソッドを呼び出すことによって扱います。

truthの評価に加わるオブジェクトがある場合は、それらのオブジェクトに対するlogicalメソッドを与えるべきです。logicalメソッドは、0 または 1 (falseまたはtrue)を出力しなければなりません。

Logicalのインデックス付けとfind

以下の2つのステートメントは、MATLABでは等価であることを意図しています。しかし、従来のリリースでは、このステートメントは、aが非doublebがゼロのみを含む場合は等価ではありませんでした。

これは、本リリースでは修正されています。以下に示すaおよびbに対して、その後に続く3つの式は同じ結果を出力します。

この修正の結果として、最後の2つのいずれか、つまりfindの利用を必要とする形式の代わりに、より簡単な形式を使うことができます。

空配列の連結

空配列は、連結演算において、出力のデータタイプに影響を与えます。この現象が見られるのは、doubleslogicalsを結合するときだけです。従来のバージョンのMATLABでは、下記の例は、logical属性をもつdouble配列を出力しました。現在は、空のdouble入力は無視されないため、doubleを出力します。

空のセル配列の連結.   空のセル配列と数値またはキャラクタ値を連結することはできません。

sparseクラスは属性です

従来のバージョンのMATLABでは、sparseは、first classデータタイプで、かつMATLABクラス(doubleのサブクラス)でした。これは、つぎの例で示されています(MATLAB 6.1で実行)。ここで、sparse(eye(3))sparse arrayを生成します。

MATLAB 6.5 では、sparseはMATLABクラスの属性になります。下記のクラスの階層図は、MathWorksの sparseに対する長期的な計画を示しています。ここで、fullsparseはすべてのMATLABクラスの属性です。

同じ例題をMATLAB 6.5 で実行すると、sparse属性をもつdouble arrayを生成します。

関連する関数への影響.   下記の表は、スパース配列に対して実行される関数から得られる結果を比較しています。表の変数aは、以下のようにして得られます。

issparseの挙動は変更されていません.   上記の表において、issparseは、sparse属性をもつ配列に対しては、スパース配列についての従来のリリースと同様に1を出力します。

算術演算.   算術演算は現在と同様に、スパースなdoublesについて機能します。

ストレージタイプの決定.   プログラムが、行列がスパースストレージを利用しているかどうかを決定するためにclassまたはisaを使っていないことを確認してください。代わりにissparseを使ってください。このコマンドは単純で、高速です。

@sparseディレクトリのメソッド.   スパース行列を取り扱うアルゴリズムを作成し、それを@sparseディレクトリに置く場合は、sparseはクラスではないため、MATLABはアクセスしません。

MAT-ファイル.   旧バージョンのMATLABで作成したスパース配列を含むMAT-ファイルは、MATLAB 6.5 では正常にロードされます。sparse arrayはMATLAB 6.5 でロードされたとき、sparse属性をもつdouble配列、または配列がオリジナルでlogical属性をもつ場合はsparse属性をもつlogical配列です(logicalの変更に関する情報はlogical属性はクラスになっていますを参照)。

Fullへの変換.   double(x)の代わりにfull(x)を使って変数xがフルであることを確認してください。関数doubleは、配列のスパース性を除去しません。

配列をフルにするには、fullを利用してください。

フルに対するテスト.   つぎのステートメントは、配列がフル(非スパース)であるかどうかを調べるためには使われません。sparseクラスは、MATLAB 6.5 では削除されているため、このステートメントは、フルとスパースの両方の配列に対して1を出力します。

フル配列に対するテストには、上記のステートメントの代わりに、以下を利用してください。

たとえば、スパース配列sを作成し、フル配列であるかどうかを調べるためには、つぎのようにします。

インデックス付き割り当て.   MATLABのデータ属性は、規則として、インデックス付きの割り当てについて保存されません。これは、属性に対してと同様に、sparseに対しても正しいものです。

この例題は、スパースdouble配列を作成します。(s(:) = rand(3))の後に続くフルdoubleへのインデックス付き割り当ては、配列からsparse属性を削除します。

サブスクリプトエラーの一貫性のある取り扱い

MATLABが無効なサブスクリプトを取り扱う方法は、MATLAB 6.5 ではより矛盾のないものとなっています。MATLABは、つぎの1つのエラーメッセージにより、下記のすべての状況に応答します。

このエラーを発生させる無効なサブスクリプトのタイプは、以下の通りです。

サブスクリプトのタイプ

Complex
x(2i)
Noninteger
x(1.2)
Negative
x(-5)
Zero
x(0)
NaN
x(NaN)
Infinity
x(Inf), x(-Inf)

サブスクリプトとして利用しようとしている非整数値がある場合は、roundを使って送り込むことができます(例 x(round(1.5)) )。

しかし、x(logical(0))は条件を満たします。

唯一の機能的な変更点は、非整数値を使ったサブスクリプトはワーニングではなく常にエラーとして扱われることです。 従来のバージョンのMATLABでは、これはスパース行列に対してのみエラーでした。

論理エラーの一貫性のある取り扱い

MATLABは、つぎのタイプの無効な論理表現のタイプに、以下のように応答します。

比較での空配列.   equal またはnot equalの比較ステートメントで空配列を使う場合は、MATLABは空配列を結果として出力します。従来のバージョンでは、MATLABはゼロを出力し、ワーニングを表示しました。

たとえば、つぎのステートメントは、空配列を出力します。

従来の返り値は、さらに古いMATLABの挙動のなごりでした。新規の返り値は、空配列を含むその他のすべてのバイナリ演算との整合性があります。たとえば、[] + 5 は []になります。

無効と考えられる操作

つぎの操作は、エラーまたはワーニングを出力します。

複素数をifまたはwhileに渡す.   複素数値をifまたはwhileに渡すと、エラーを出力します。

従来は、虚部は引数がスパースである限りは無視されました。

NaNをifまたはwhileに渡す.   NaNifまたはwhileに渡すと、エラーを出力します。

従来は、NaNlogical属性をもたない限りはエラーを生成しました。

複素数をlogicalに渡す.   複素数引数を関数logicalに渡すか、あるいは複素数値をlogical変数に割り当てると、エラーを出力します。

これは、常にエラーです。.

NaNをlogicalに渡す.   NaN引数を関数logicalに渡すか、あるいはNaNを変数logicalの値に割り当てると、エラーを出力します。

従来は、this assigned a the value NaN with a logical attribute.

複素数をand, or, notに渡す.   複素数引数を関数and, or, notに渡すとエラーを出力します。

従来は、これはaにゼロを割り当てました。

NaNをand, or, notに渡す.   NaNを関数and, or, notに渡すとエラーを出力します。

従来は、これはaにゼロを割り当てました。

非論理値をlogicalに割り当てる.   関数logicalに不整合な引数を渡すか、あるいはそれらをlogical変数に割り当てると、ワーニングを生成します。下記の例題で、logical配列に割り当てられる値(100)は、MATLABによってlogical 1に変換されます。

従来は、これはワーニングは出力せず。100a(2,3)に割り当てました。


  数学機能のアップグレードの問題 グラフィックスのアップグレードの問題