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();
}
}