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)
に割り当てました。
![]() | 数学機能のアップグレードの問題 | グラフィックスのアップグレードの問題 | ![]() |