Java での MATLAB 構造体の使用
MATLAB 構造体
MATLAB® 構造体はデータを格納し、フィールド名を使用してそのデータを参照します。各フィールドには任意の型のデータを含めることができます。MATLAB コードは structName.fieldName 形式のドット表記を使用して、構造体内のデータにアクセスします。MATLAB 構造体のクラスは struct です。
Java® の com.mathworks.matlab.types.Struct クラスを使用すると、次のことができます。
Java で
Structを作成して MATLAB に渡す。MATLAB
structを作成して Java に返す。
com.mathworks.matlab.types.Struct クラスは java.util.Map インターフェイスを実装します。ただし、MATLAB から返された Struct のマッピング、キー、あるいは値を変更することはできません。
MATLAB 関数への Struct の引き渡し
MATLAB 関数 set は、MATLAB グラフィックス オブジェクトのプロパティを設定します。set の 1 回の呼び出しで複数のプロパティを設定するには、MATLAB struct を使用すると便利です。この struct には、設定するプロパティの名前と一致するフィールド名を定義します。このフィールドが参照する値は、プロパティに割り当てられた値です。
このコード例では、以下の手順が実行されます。
MATLAB を起動します。
double 配列を MATLAB 関数
plotに渡します。MATLAB ハンドル オブジェクトを
com.mathworks.matlab.types.HandleObjectとして Java に返します。プロパティの名前と値を使用して
com.mathworks.matlab.types.Structを作成します。MATLAB グラフを作成し、
5秒間表示します。fevalを使用して、HandleObjectとStructを MATLAB 関数setに渡します。この関数により、プロットされたデータの色と線幅が変更されます。プロットを
myPlotという名前のjpegファイルにエクスポートし、エンジンの接続を閉じます。
import com.mathworks.engine.*;
import com.mathworks.matlab.types.*;
public class CreateStruct {
public static void main(String[] args) throws Exception {
MatlabEngine eng = MatlabEngine.startMatlab();
double[] y = {1.0, 2.0, 3.0, 4.0, 5.0};
HandleObject h = eng.feval("plot", y);
eng.eval("pause(5)");
double[] color = {1.0, 0.5, 0.7};
Struct s = new Struct("Color", color, "LineWidth", 2);
eng.feval("set", h, s);
eng.eval("print('myPlot', '-djpeg')");
eng.close();
}
}MATLAB からの Struct の取得
MATLAB 関数 axes は、グラフの座標軸を作成し、ハンドル オブジェクトの参照を返します。MATLAB 関数 get を 1 つの出力を指定して呼び出すと、グラフィックス オブジェクトのプロパティと共に MATLAB struct が返されます。
このコード例では、以下が実行されます。
MATLAB グラフィックス オブジェクトを作成し、オブジェクト ハンドルを
HandleObjectとして返す。グラフィックス オブジェクトのプロパティと値が格納された MATLAB 構造体を作成し、
Structとして返す。FontNameプロパティの値をStructから取得する。FontNameキーの値の変更を試行する。ただし、Structは変更できないため、UnsupportedOperationExceptionが発生します。
import com.mathworks.engine.*;
import com.mathworks.matlab.types.*;
public class GetStruct {
public static void main(String[] args) throws Exception {
MatlabEngine eng = MatlabEngine.startMatlab();
HandleObject h = eng.feval("axes");
Struct s = eng.feval("get", h);
Object fontName = s.get("FontName");
System.out.println("The font name is " + fontName.toString());
try {
s.put("FontName", "Times");
}catch(UnsupportedOperationException e){
e.printStackTrace();
}
eng.close();
}
}