9

Eclipse で開発された Java アプリケーションから 3 つの引数 (Java 文字列) を取るユーザー定義の Matlab 関数 (M ファイル) を呼び出そうとしています。現時点では、orのような関数/コマンドでproxy.evalandproxy.fevalメソッドを呼び出すことができます。しかし、ユーザー定義関数を呼び出そうとすると、matlab コンソールで、そのように定義された関数はなく、Java コンソールで発生すると表示されます。dispsqrMatlabInvocationException

次に、引数をとらず、1行だけの単純なユーザー定義関数を試しましたdisp('Hello')が、結果は同じです。したがって、型変換の問題ではなく、ユーザー定義関数の呼び出し方法に問題があると思います。

誰かすぐに助けてくれませんか?私はこのプロジェクトの締め切りにもうすぐ間に合います。誰かが解決策を考え出すことができれば、私はとても感謝しています。(Joshuwa Kaplan さん、あなたの投稿でこのような問題を解決するためのガイドはありますか?試してみましたが、何も見つかりませんでした)

前もって感謝します

4

1 に答える 1

11

まるでMATLAB内で通常作業しているかのように、 MATLAB検索パスにユーザー定義のmファイルが必要です。

次の例でテストしました。

C:\ some \ path \ myfunc.m

function myfunc()
    disp('hello from MYFUNC')
end

HelloWorld.java

import matlabcontrol.*;

public class HelloWorld
{
    public static void main(String[] args)
        throws MatlabConnectionException, MatlabInvocationException
    {
         // create proxy
         MatlabProxyFactoryOptions options =
            new MatlabProxyFactoryOptions.Builder()
                .setUsePreviouslyControlledSession(true)
                .build();
        MatlabProxyFactory factory = new MatlabProxyFactory(options);
        MatlabProxy proxy = factory.getProxy();

        // call builtin function
        proxy.eval("disp('hello world')");

        // call user-defined function (must be on the path)
        proxy.eval("addpath('C:\\some\\path')");
        proxy.feval("myfunc");
        proxy.eval("rmpath('C:\\some\\path')");

        // close connection
        proxy.disconnect();
    }
}

Javaプログラムをコンパイルして実行します。

javac -cp matlabcontrol-4.0.0.jar HelloWorld.java
java -cp ".;matlabcontrol-4.0.0.jar" HelloWorld

MATLABセッションが開き、出力が表示されます。

hello world
hello from MYFUNC

フォルダをパスに一度追加してから、SAVEPATHを使用して永続化することもできます。そうすれば、毎回それをする必要はありません。

于 2011-08-27T04:56:57.770 に答える