| MATLAB Release Notes | ![]() |
外部インタフェース/APIのアップグレードの問題
MATLAB 6.1 から MATLAB 6.5 へのアップグレードの問題は、外部インタフェース/API機能については、以下に説明します。以下の項目があります。
logicalおよびsparseデータタイプの変更
MATLAB 6.5 では、sparseデータタイプは、その元となるデータタイプの属性に変更されています。また、logicalデータ属性は、first classデータタイプに変更されています。詳細は、プログラミングとデータタイプのアップグレードの問題を参照してください。
以下の節では、この変更がCプログラムにどのように影響を与えるかを説明します。
mxIsLogicalは変更されていません. 関数mxIsLogicalは、MATLAB 6.5 では変更されていません。従来のリリースでlogical属性をもつ配列に対して出力したように、logical配列に対してtrueを出力します。
数値のテスト. 従来のリリースでは、mxIsNumericは、logical属性をもつ数値配列に対してtrueを出力しました。logicalは非数値データタイプであるため、この関数は、logical配列に対してfalseを出力します。
logicalに対するmxGetClassIDの利用. mxGetClassIDは、logical配列に対して新規の値mxLOGICAL_CLASSを出力します。
スパース配列に対するmxGetClassIDの利用. mxGetClassIDは、列挙された値mxSPARSE_CLASSを出力しません。代わりに、元になるデータタイプに対応する列挙された値を出力します。mxArrayがスパースであるかどうかを決定するには、mxIsSparseを使ってください。
スパース性のテスト. 従来のリリースでは、以下のステートメントを使って行列がスパースであるかどうかを決定することができました。これは、MATLAB 6.5 では機能しません。
行列がスパースであるかどうかを決定するには、mxIsSparse(x)を利用してください。関数mxIsSparseは、従来のリリースと同様に機能し、上記の操作よりも高速に実行します。
mxIsDoubleを使ったスパース性のテスト. sparseは、MATLABデータタイプからデータ属性に変更されているため、mxIsDouble(x)は、従来のリリースのように~mxIsSparse(x)を意味しません。代わりにmxIsSparseを使って配列のスパース性をテストしてください。
mxIsSparseは変更ありません. 関数mxIsSparseは、MATLAB 6.5 では変更されていません。従来のリリースでsparse配列に対して出力したのと同様に、sparse属性をもつ配列に対してtrueを出力します。
新規Logical関数. 本リリースでは、9個の新規 C mx関数を導入しています。
| 関数 |
詳細 |
mxCreateLogicalArray |
falseに初期化されたN次元、logical mxArrayを作成 |
mxCreateLogicalMatrix |
falseに初期化された2次元、logical mxArrayを作成 |
mxCreateLogicalScalar |
falseに初期化された、スカラ、logical mxArrayを作成 |
mxCreateSparseLogicalMatrix |
要素をもたない2次元、スパースlogical mxArrayを作成 |
mxGetLogicals |
logical配列データのポインタを取得 |
mxIsLogicalScalar |
if クラスmxLOGICALのスカラmxArrayである場合はTrue |
mxIsLogicalScalarTrue |
クラスmxLOGICALのスカラmxArrayが真ならばTrue |
廃止されたlogical関数. つぎの2つの関数は、廃止されています。これらの関数のサポートは、将来のリリースでは削除される予定です。
| 関数 |
詳細 |
mxClearLogical |
mxArrayを数値タイプに変換 |
mxSetLogical |
mxArrayをlogicalタイプに変換 |
C APIの新規mx関数
新規関数logicalに加えて、MATLAB 6.5 は、以下の新規C mx関数を導入しています。
| 関数 |
詳細 |
mxCreateDoubleScalar |
指定した値に初期化されたスカラ倍精度配列を作成 |
mxGetChars |
キャラクタ配列データのポインタを取得 |
注意
mxCreateDoubleScalarは、mxCreateScalarDoubleを差し替えています(mxCreateScalarDoubleは、現時点でサポートされています)。
|
新規および廃止されたAPI関数
MATLABは、6.5 では、変数名をmxArrayに格納せずに、より効率的にmxArrayを扱います。mxArray名が必要なときは、引数リストに渡してください。
MATLABは、以下の表の右側の列にある関数を置き換えている新規CおよびFortran関数を提供します。新規関数は、mxArrayの名前を追加の引数として渡します(表の下の例を参照)。
右側の列の関数は廃止されており、将来のバージョンのMATLABでは利用できない場合があります。
| 新規関数 |
従来の関数 |
mexGetVariable |
mexGetArray |
mexGetVariablePtr |
mexGetArrayPtr |
mexPutVariable |
mexPutArray |
engGetVariable |
engGetArray |
engPutVariable |
engPutArray |
matDeleteVariable |
matDeleteArray |
matGetVariable |
matGetArray |
matGetVariableInfo |
matGetArrayHeader |
matGetNextVariable |
matGetNextArray |
matGetNextVariableInfo |
matGetNextArrayHeader |
matPutVariable |
matPutArray |
matPutVariableAsGlobal |
matPutArrayAsGlobal |
以下の2行目で置き換えます。mxArrayの名前は、mxSetNameによってmxArrayに格納されるのではなく、matPutVariableを使って渡されます。
C++ ファイルのコンパイル
C++ MEXファイルをコンパイルするために、あらかじめ設定されたオプションファイルcxxopts.shを利用する必要はありません。MATLABは、以下のファイル拡張子をC++ 拡張子として認識し、C++コンパイラを自動的に利用します。
cxxopts.shファイルは、MATLABでは利用できません。
また、UNIXでは、C++オブジェクトをリンクしている場合は、MEXスクリプトの-cxxスイッチを利用する必要があります。
LAPACKに対するLCCのサポート
Windowsプラットフォームでは、MATLAB CコンパイラLccを使って、LAPACKおよびBLAS関数を呼び出すC MEX-ファイルをコンパイル、リンクすることができます。ファイルmyCmexFile.cをコンパイルし、LAPACKライブラリファイルlibmwlapack.libにリンクするには、以下のコマンドを利用してください。
用語<matlab>は、MATLABルートディレクトリを意味します。
MATLAB COMインタフェースに対するクライアントサポートは、MATLAB 6.5では大きく変更されています。多くの新規に加えて、従来サポートされていた機能の重要な変更があります。本節では、これらの変更点が既存のプログラムにどのように影響を与えるかを説明します。
詳細は、リリースノートの新規COMクライアントサポート機能とMATLABドキュメントのMATLAB COM Client Supportを参照してください。
COM環境の切り替え. MATLABは、新規のMATLAB 6.5 COM環境をデフォルトとします。この環境では、本節やMATLAB 6.5ドキュメントで記述されている新機能を利用することができます。
MATLAB 6.5 よりも以前のCOM環境を利用するには、以下のコマンドを入力してください。
MATLAB 6.5 COM環境に戻るには、つぎのようにタイプします。
オブジェクトまたはインタフェースの作成. actxcontrolまたはactxserverを使ってCOMコントロールまたはサーバを作成するとき、MATLABは、activex objectとしてではなく、COM.<string>として表示されるCOMオブジェクトを出力します。
これは、COMオブジェクトのインタフェースにも適用されます。MATLABは、activex objectではなく、Interface.<string>としてインタフェースを表わします。
存在しないProgIDの新規エラー. actxcontrolとactxserverは、両方共無効なProgIDが入力されたときに異なるエラーメッセージを出力します。
h = actxcontrol('xxxxx') ??? Error using ==> actxcontrol Control creation failed. Invalid ProgID 'xxxxx'
getにより出力されるデータ. 関数getが出力する情報は、各インタフェースに対するタイプを示します。
h = actxserver ('Excel.Application'); get(h) ans = Application: [1x1 Interface.excel.application.Application] Parent: [1x1 Interface.excel.application.Parent] Windows: [1x1 Interface.excel.application.Windows] Workbooks: [1x1 Interface.excel.application.Workbooks] . .
getが出力するプロパティ名は、アルファベット順には並べられません。Type Libraryから取得される順番で表示されます。
引数なしで呼び出されるSet. 関数setをオブジェクトトまたはインタフェースのハンドル以の引数を使わずに呼び出すとき、MATLABはエラーを出力しません。その代わりに、オブジェクトのすべてのプロパティをリストしている構造体配列を出力します。構造体配列は、それらのプロパティの列挙された値も含み、値を列挙された文字列として表わすことができます。
invokeにより出力されるメソッドデータの変更. 関数invokeは、オブジェクトまたはインタフェースのメソッドについてより役立つデータを出力します。以下の例に見られる違いに注目してください。
h = actxserver('excel.application'); % Invoke, prior to MATLAB 6.5 invoke(h) DeleteCustomList = Void DeleteCustomList (Int) MailLogon = Void MailLogon (Variant[opt], Variant[opt], Variant[opt]) NextLetter: 'Variant(Pointer) NextLetter ()' : : % Invoke, in MATLAB 6.5 invoke(h) DeleteCustomList: 'void DeleteCustomList(handle, int32)' MailLogon: 'void MailLogon(handle, [Optional]Variant)' NextLetter: 'handle NextLetter(handle)' : :
また、必要なhandle引数は明示的に示されていることに注意してください。
COMに対する関数method. 関数methodsは、指定したクラスのすべての メソッドに対する名前を出力します。
h = actxcontrol('MWSAMP.MWSampCtrl.1'); methods(h) Methods for class COM.mwsamp.mwsampctrl.1: AboutBox GetR8Array SetR8 move Beep GetR8Vector SetR8Array propedit FireClickEvent GetVariantArray SetR8Vector release GetBSTR GetVariantVector addproperty save : :
COMオブジェクトにおいて関数methodsviewを使ってオブジェクトプロパティのグラフィカル表示を取得することも可能です。
引数をもつプロパティ. MATLAB 6.5では、引数を取るプロパティは、メソッドとして扱われます。たとえば、ExcelアプリケーションサーバのRangeおよびItemプロパティは、現在はメソッドです。
そのため、ItemがSheetsのpropertyのとき、つぎのステートメント
は、以下のように書き換えることができます。ここで、ItemはSheetsのmethod です。
Sheetsに対するプロパティとメソッドのリストを要求する場合は (それぞれgetとinvokeを使って)、MATLABはItemをメソッドとしてリストします。
下位互換性のため、MATLAB 6.5 の関数は、メソッドおよびプロパティとして引数をもつプロパティをサポートします。
イベントハンドラの引数. コントロールがイベントをトリガするとき、MATLABは引数をコントロールから登録されたイベントハンドラに渡します。MATLABは、2つの引数を渡します。
イベントハンドラに影響を与える変更に関する情報は、MATLABドキュメントのWriting Event Handlersを参照してください。
識別子を使ってイベントを指定. 関数actxcontrolまたはregistereventを使ってハンドラ関数をもつイベントを登録するときに、イベントID番号またはイベント名によってイベントを指定することができます。
h = actxcontrol('MWSAMP.MwsampCtrl.2', [0 0 200 200], f, ... {-600, 'myclick'; -601 'my2click'; -605 'mymoused'});
h = actxcontrol('MWSAMP.MwsampCtrl.2', [0 0 200 200], f, ... {'Click', 'myclick'; 'DblClick' 'my2click'; ... 'MouseDown' 'mymoused'});
Use the 新規関数eventsを使って、COMオブジェクトによって認識されるすべての利用中のイベントの名前を表示します。たとえば、mwsampコントロールに対するすべてのイベントをリストするには、以下を利用します。
f = figure ('pos', [100 200 200 200]); h = actxcontrol ('mwsamp.mwsampctrl.2', [0 0 200 200], f); events(h) Click = void Click() DblClick = void DblClick() MouseDown = void MouseDown(int16 Button, int16 Shift, Variant x, Variant y)
Boolean返り値. Boolean値を出力するプロパティについてgetを呼び出すと、1を出力し、trueであることを示します。従来は、trueに対して-1を出力しました。
h = actxserver('Excel.Application'); set(h, 'DisplayStatusBar', 1); get(h, 'DisplayStatusBar') ans = 1
また、Boolead値を出力するメソッドを呼び出すと、1を出力し、trueであることを示します。これは、従来は、trueに対して-1を出力しました。
コントロールまたはサーバのリリースと削除. 本リリースは、MATLABでの潜在的なメモリリークに対処しています、メモリリークは、以下によって発生していました。
releaseまたはdeleteを明示的に利用しないと、COMオブジェクトまたはインタフェースを完全にクリーンアップしませんでした。たとえば、つぎのclearコマンドは、オブジェクトによって利用されるすべてのメモリを解放しませんでした。明示的なrelease(h)は、clearの前に実行する必要がありました。
COMオブジェクトまたはインタフェースの明示的な解放または削除は、現在は必要ありません。MATLABは、clearが呼び出されたとき、あるいはオブジェクトまたはインタフェースを表わす変数が新規の値を割り当てるか、範囲外になったときに、オブジェクトまたはインタフェースをメモリから正常にクリアします。
| グラフィックスのアップグレードの問題 | グラフィカルユーザインタフェースの作成(GUIDE)のアップグレードの問題 | ![]() |