| 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は上記の表の左列にあるwarningのすべての利用が可能です。しかし、変更の中には、下記の表のように実際の挙動に対して行われるものがあります。
つぎの表は、MATLAB 6.0 warningコマンドシンタックスに応じたMATLAB 6.5 の挙動を示します。
ワーニングによる出力. MATLAB 6.5 より以前では、warningは、最大で2つの出力、stateとfrequencyを出力しました。これらは、どちらも現在は意味がありません。また、出力する単一のワーニング状態や単一のワーニングの頻度でもありません。
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 > 10はlogical属性をもつdouble arrayを生成します。
a = magic(4); b = a > 10; whos b Name Size Bytes Class b 4x4 128 double array (logical) Grand total is 16 elements using 128 bytes
MATLAB 6.5 では、logicalはfirst classデータタイプかつMATLABクラスです。下記のクラス階層図は、logicalがクラスであり、キャラクタやセル配列のような他のfirstクラスタイプと等価であることを示します。

同じ例題をMATLAB 6.5 で実行すると、クラスlogical arrayの結果を生成します。
a = magic(4); b = a > 10; whos b Name Size Bytes Class b 4x4 16 logical array Grand total is 16 elements using 16 bytes
| 注意 MATLAB 6.5 の論理配列は、必要なストレージ容量が削減されています。上記の例題で、配列を格納するにはMATLAB 6.1 では128バイト必要ですが、version 6.5 では16バイトだけです。 |
関連する関数への影響. 以下の表は、logicalタイプについて実行される多くの関数から得られる結果を比較しています。表の変数aは、つぎのように得られます。
a = (magic(4) > 10);
有効な論理値. logicalsは、値0と1のみをもつことができます。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配列になります。
混合モードの演算. 混合モードの演算(例 logicalとdoubleを含む演算)は、非logicalデータタイプに対して登録された関数をディスパッチします。logicalは、そのタイプに変換され、演算が進行します。この挙動は、MATLAB 6.0 での機能との下位互換性があります。
logicalをdoubleに変換. 関数doubleを使って、logical配列をdouble配列に変換することができます。
b = magic(4) > 10; whos b Name Size Bytes Class b 4x4 16 logical array Grand total is 16 elements using 16 bytes b = double(b); whos b Name Size Bytes Class b 4x4 128 double array Grand total is 16 elements using 128 bytes
インデックス付きの割り当て. MATLABのデータタイプは、規則としてインデックス付きの割り当てに対して予約されています。これは、現在はMATLABデータタイプであり、logicalに対して正しいものです。
つぎの例は、タイプlogicalの空配列を作成します。(a(1) = 1)の後のdoubleのインデックス付き割り当ては、タイプをdoubleに変換しません。logicalタイプは保存されます。
a = logical([]); whos a Name Size Bytes Class a 0x0 0 logical array Grand total is 0 elements using 0 bytes a(1) = 1; whos a Name Size Bytes Class a 1x1 1 logical array Grand total is 1 element using 1 bytes
NaNまたは複素数値を関数logicalに渡す. NaNまたは複素数値をifまたはwhileステートメントに渡すか、あるいはand, or, not, logicalに渡そうとすると、常にエラーを出力します。
logical(NaN) ??? Error using ==> logical NaN's cannot be converted to logicals. not(2j) ??? Error using ==> not Operands to NOT must not be complex.
'truth'の定義の変更
MATLABの進化とともに、truth の定義は複雑で矛盾したものになっています。MATLAB 6.5 の1つの目的は、すべての状況で適用されるtruthの簡単で一貫性のある定義を示すことです。
空配列と空配列またはスカラを比較. MATLABは、2つの0行0列空配列を比較したり、あるいは、0行0列空配列をスカラと比較するときに空配列([]) を出力します。この挙動は、ifとwhileステートメント内で実行される比較にも影響を与えます。
この挙動は、その他のすべてのバイナリ演算子について一貫しています(例 >, <, ~=, +, -, .*, 等)。
空配列をスカラと比較. MATLABは、0行0列空配列とサイズのある配列を比較するときに、dimension mismatchエラーを出力します。
anyまたはallと共にNaNを利用 関数anyおよびallは、NaNを無視します。そのため、anyは NaNを唯一の非ゼロ要素としてもつベクトルに対して0を出力します。allの挙動は、この変更による影響を受けませんが、anyとallはminとmaxのようなその他のreduction演算子と同様に機能することを意味します。
オブジェクトとの相互作用. 従来のバージョンのMATLABでは、ユーザ定義オブジェクトを引数としてifまたはwhileに渡すと、インタプリタは、truth が決定されているものに変換するために、(存在する場合は)オブジェクトのdoubleメソッドを呼び出しました。MATLAB 6.5 は、この状況を、最初にオブジェクトのlogicalメソッドを探し、見つからない場合には(存在する場合は)doubleメソッドを呼び出すことによって扱います。
truthの評価に加わるオブジェクトがある場合は、それらのオブジェクトに対するlogicalメソッドを与えるべきです。logicalメソッドは、0 または 1 (falseまたはtrue)を出力しなければなりません。
Logicalのインデックス付けとfind
以下の2つのステートメントは、MATLABでは等価であることを意図しています。しかし、従来のリリースでは、このステートメントは、aが非doubleでbがゼロのみを含む場合は等価ではありませんでした。
これは、本リリースでは修正されています。以下に示すaおよびbに対して、その後に続く3つの式は同じ結果を出力します。
この修正の結果として、最後の2つのいずれか、つまりfindの利用を必要とする形式の代わりに、より簡単な形式を使うことができます。
空配列の連結
空配列は、連結演算において、出力のデータタイプに影響を与えます。この現象が見られるのは、doublesとlogicalsを結合するときだけです。従来のバージョンのMATLABでは、下記の例は、logical属性をもつdouble配列を出力しました。現在は、空のdouble入力は無視されないため、doubleを出力します。
a = [ [] logical(0) ]; whos a Name Size Bytes Class a 1x1 8 double array Grand total is 1 element using 8 bytes
空のセル配列の連結. 空のセル配列と数値またはキャラクタ値を連結することはできません。
sparseクラスは属性です
従来のバージョンのMATLABでは、sparseは、first classデータタイプで、かつMATLABクラス(doubleのサブクラス)でした。これは、つぎの例で示されています(MATLAB 6.1で実行)。ここで、sparse(eye(3))はsparse arrayを生成します。
s = sparse(eye(3)); whos s Name Size Bytes Class s 3x3 52 sparse array Grand total is 3 elements using 52 bytes
MATLAB 6.5 では、sparseはMATLABクラスの属性になります。下記のクラスの階層図は、MathWorksの sparseに対する長期的な計画を示しています。ここで、fullとsparseはすべてのMATLABクラスの属性です。

同じ例題をMATLAB 6.5 で実行すると、sparse属性をもつdouble arrayを生成します。
s = sparse(eye(3)); whos s Name Size Bytes Class s 3x3 52 double array (sparse) Grand total is 3 elements using 52 bytes
関連する関数への影響. 下記の表は、スパース配列に対して実行される関数から得られる結果を比較しています。表の変数aは、以下のようにして得られます。
a = sparse(eye(3));
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は、配列のスパース性を除去しません。
s = sparse(eye(3)); s = double(s); whos s Name Size Bytes Class s 3x3 52 double array (sparse) Grand total is 3 elements using 52 bytes
配列をフルにするには、fullを利用してください。
s = full(s); whos s Name Size Bytes Class s 3x3 72 double array Grand total is 9 elements using 72 bytes
フルに対するテスト. つぎのステートメントは、配列がフル(非スパース)であるかどうかを調べるためには使われません。sparseクラスは、MATLAB 6.5 では削除されているため、このステートメントは、フルとスパースの両方の配列に対して1を出力します。
フル配列に対するテストには、上記のステートメントの代わりに、以下を利用してください。
たとえば、スパース配列sを作成し、フル配列であるかどうかを調べるためには、つぎのようにします。
インデックス付き割り当て. MATLABのデータ属性は、規則として、インデックス付きの割り当てについて保存されません。これは、属性に対してと同様に、sparseに対しても正しいものです。
この例題は、スパースdouble配列を作成します。(s(:) = rand(3))の後に続くフルdoubleへのインデックス付き割り当ては、配列からsparse属性を削除します。
s = sparse(eye(3)); whos s Name Size Bytes Class s 3x3 52 double array (sparse) Grand total is 3 elements using 52 bytes s(:) = rand(3); whos s Name Size Bytes Class a 3x3 72 double array Grand total is 9 elements using 72 bytes
サブスクリプトエラーの一貫性のある取り扱い
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) |
サブスクリプトとして利用しようとしている非整数値がある場合は、 |
唯一の機能的な変更点は、非整数値を使ったサブスクリプトはワーニングではなく常にエラーとして扱われることです。 従来のバージョンのMATLABでは、これはスパース行列に対してのみエラーでした。
論理エラーの一貫性のある取り扱い
MATLABは、つぎのタイプの無効な論理表現のタイプに、以下のように応答します。
logicalの無効な引数 (例 logical(2)):
logicalsの無効な割り当て(例 x = logical([1 0 1]); x(2) = 2):
logicalに対する複素数の割り当て (例 logical(i)):
NaNの利用(例 logical(NaN)):
and, or, notを使った表現でのNaN (例 5 & NaN):
注意
論理値は、1 (trueに対して)および0 (falseに対して)です。その他の非ゼロの値は、暗示的にtrueに変換されます。複素数値とNaNは、暗示的に変換できません。これらをlogicalsに変換するには~=0を使ってください。たとえば、x logicalにするには、x = (NaN~=0)を使ってください。
|
比較での空配列. equal またはnot equalの比較ステートメントで空配列を使う場合は、MATLABは空配列を結果として出力します。従来のバージョンでは、MATLABはゼロを出力し、ワーニングを表示しました。
従来の返り値は、さらに古いMATLABの挙動のなごりでした。新規の返り値は、空配列を含むその他のすべてのバイナリ演算との整合性があります。たとえば、[] + 5 は []になります。
無効と考えられる操作
複素数をifまたはwhileに渡す. 複素数値をifまたはwhileに渡すと、エラーを出力します。
NaNをifまたはwhileに渡す. NaNをifまたはwhileに渡すと、エラーを出力します。
従来は、NaNがlogical属性をもたない限りはエラーを生成しました。
複素数を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に渡すとエラーを出力します。
NaNをand, or, notに渡す. NaNを関数and, or, notに渡すとエラーを出力します。
非論理値をlogicalに割り当てる. 関数logicalに不整合な引数を渡すか、あるいはそれらをlogical変数に割り当てると、ワーニングを生成します。下記の例題で、logical配列に割り当てられる値(100)は、MATLABによってlogical 1に変換されます。
a = (magic(4) > 10); a(2,3) = 100 Warning: Values other than 0 or 1 converted to logical 1 a = 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 0
従来は、これはワーニングは出力せず。100をa(2,3)に割り当てました。
| 数学機能のアップグレードの問題 | グラフィックスのアップグレードの問題 | ![]() |