【问题标题】:How to redirect output from java to matlab如何将java的输出重定向到matlab
【发布时间】:2012-09-30 07:16:54
【问题描述】:

我有一个已编译的 .JAR 文件,它获取两个数据集作为输入并产生一些分数(实数)。输出打印在控制台(cmd 提示符环境)中。但是我想在我的 matlab 代码中多次调用该函数。我无权访问 JAR 文件的源代码。是否有任何有效的方法(可能不是使用文件)将 jar 文件的结果返回给 matlab。

JAR 输出示例:


a:82.212 %

b: 0 %

c: 0.003 %


d: 13.471 %

e: 4.809 %


我想要这 5 个数字。它们始终以相同的格式打印。

有什么方法可以将这些结果重定向到例如 matlab 可以读取结果的 TCP/IP 端口?

谢谢

【问题讨论】:

  • 怎么调用java,方法的接口是什么?输入数据集有多大?
  • 我在matlab中使用系统函数。有趣的是我是否可以将结果从 jar 重定向到文件以外的其他想法(例如 tcp/ip 端口),然后从 matlab 读取结果。数据集不是问题,只有结果对我很重要。

标签: matlab redirect interface jar


【解决方案1】:

使用来自system() 函数的第二个输出result。它将包含您需要解析的所需输出字符串。

[status, result] = system('command');

现在,假设您有 result 字符串,您可以在这里将其解析为值向量:

names = {'a', 'b', 'c', 'd', 'e'}';
values = nan(size(names));
for k = 1 : length(names)
    idx = strfind(result, names{k});
    assert(numel(idx) == 1);
    values(k) = sscanf(result(idx + length(names{k}) + 1 : end), '%f');
end

【讨论】:

  • 非常感谢。这就是答案。我建议将 idx 定义为一个数组并使用“idx[k] = strfind(result(idx(k-1)+1):end, names{k});”。这使得处理更复杂的情况成为可能。谢谢
  • 我确信解析字符串可以更有效地完成,这只是一个例子。不客气。
【解决方案2】:

另一个要考虑的选项是将 JAR 链接到您的 Matlab 程序,方法是将其放在 javaclasspath 中。然后,您可以直接从您的 M 代码调用 JAR 中定义的任何公共对象的方法。如果有一个合适的入口点来计算这些值,您可以直接调用计算方法,而不是通过 JAR 的main,并避免使用单独的 JVM 进程和解析输出的开销。如果你最终调用它很多,它会更有效率。

【讨论】:

  • 我已经反编译了 JAR 文件,它产生了一些 JAD 文件。现在我正在谷歌搜索关于集成 matlab 和 java 的信息,如你上面所说。
  • Matlab 文档的“外部接口”部分(在帮助浏览器或 Mathworks 网站上)有关于此的信息。这是一个很好的起点:mathworks.com/help/matlab/matlab_external/…
  • 我同意直接从 Matlab 使用 Java 对象和方法比使用 system() 调用更好
  • 你不需要反编译JAR,只需像这样将它添加到Matlab的Java类路径中: javaaddpath(fullfile(pwd,'Jar','MyJarName.jar')); (假设您的 jar 名为 MyJarName.jar 并位于当前工作目录的 Jar 目录中)。您可以简单地以与 Matlab 类类似的方式实例化 Java 类,例如myInstance = org.foo.bar.SomeJavaClass(); (包括类的包名)。然后你可以直接调用Java类的方法,例如myInstance.someMethod();
猜你喜欢
  • 2014-03-27
  • 2016-06-05
  • 2013-01-02
  • 2012-06-26
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2014-10-31
相关资源
最近更新 更多