Main Content

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 を使用して、HandleObjectStruct を 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();
    }
}

関連するトピック