为编译的MATLAB提供控制台(disp)输出> Java程序(使用MATLAB编译器)

时间:2012-12-12 09:37:53

标签: java matlab console matlab-deployment

编辑2 在收到Mathworks支持的回复后,我自己回答了这个问题。简而言之,有一个选项类MWComponentOptions在实例化时传递给导出的类。除其他外,这可以为错误输出和常规输出(即来自disp() - 喜欢的函数)指定唯一的打印流。感谢所有的回应:)

=============================================== =====================

一个简单的问题 - 有没有办法阻止MATLAB代码在编译后输出到disp(和类似)函数的Java控制台? MATLAB中有用的调试信息很快就会成为Java日志中令人讨厌的额外文本。

我正在使用的编译工具是MATLAB Compiler(我认为它与MATLAB Builder JA不同,但我可能错了)。我在mcc命令上找不到任何好的文档,所以我不确定是否有任何选项。

当然,如果这是不可能的,并且编译器将所有MATLAB代码转换为Java等价物的直接结果那么这完全可以理解。

提前致谢

编辑这对于单独处理Java端的错误报告也很有用 - 目前所有MATLAB错误都会被发送到控制台,无论它们是否被捕获。

3 个答案:

答案 0 :(得分:2)

如果在已部署的应用程序(例如MATLAB Compiler或Builder JA)中运行,isdeployed函数返回true,而在实时MATLAB中运行则返回false。

您可以使用disp数据块包围if isdeployed语句。

答案 1 :(得分:2)

我从Mathworks支持请求中回复,他们提供了以下解决方案:

创建导出的任何类时,可以指定MWComponentOptions对象。这在R2012b中记载的很少,但是对于我想要的内容,以下示例可行:

MWComponentOptions options = new MWComponentOptions();
PrintStream o = new PrintStream(new File("MATLAB log.log"));

options.setPrintStream(o); // send all standard dips() output to a log file
// the following ignores all error output (this will be caught by Java exception handling anyway)
options.setErrorStream((java.io.PrintStream)null);

// instantiate and use the exported class
myClass obj = new myClass(options);
obj.myMatlabFunction();
// etc...

<强>更新

如果有人想要取消所有输出,则nulljava.io.PrintStream,最终会导致部署NullPointerException。抑制所有输出的更好方法是用于创建虚拟打印流,如:

PrintStream dummy = new PrintStream(new OutputStream() {
    public void close() {}
    public void flush() {}
    public void write(byte[] b) {}
    public void write(byte[] b, int off, int len) {}
    public void write(int b) {}
} );

然后使用

options.setErrorStream(dummy);

希望这会有所帮助:)

答案 2 :(得分:1)

如果你有一个独立的应用程序并且根本不想打扰类,那么另一个可能的黑客攻击:

在编译期间使用evalc并部署您的func名称:

function my_wrap()
    evalc('my_orig_func(''input_var'')');
end

编译如

mcc -m my_wrap my_orig_func <...>

嗯,这显然是另一个黑客。