查看: 1500|回复: 1|关注: 0

[未答复] Java调用Matlab实践

[复制链接]

新手

5 麦片

财富积分


050


1

主题

2

帖子

0

最佳答案
发表于 2017-12-18 11:25:10 | 显示全部楼层 |阅读模式
本帖最后由 jiangyb_matlab 于 2017-12-18 11:27 编辑

实验目的

把Matlab编写函数导出Java的Jar包,在没有GUI的Linux服务端使用。

经过试验发现:

(1) 在osx导出的jar包,在Linux下是可以使用的,因为matlab函数最终是被编译成为跨平台的ctf文件。

(2) Matlab和Matlab Runtime的版本必须严格相同,此外java的版本最好一致,比如编译环境是java8,运行环境也最好是java8。

(3) 到目前为止,在Linux下测试plot函数,目前尚未试验出结果,即使在GUI环境下也失败,主要是Java的JNI调用OpenGL出现很多问题,很难配置成功;不过好在,我们是做服务端开发的,不需要绘图,也不需要GUI。


1. 编写Matlab函数文件plotsin.m

function out=plotsin(first,step,last)

in=first:step:last;

out=sin(in);

end

2. 导出Jar Library
image.png


                               
登录/注册后可看大图


最终得到plotsin/for_redistribution_files_only/plotsin.jar


3. Centos下测试

(1) MCR安装

unzip MCR_R2017b_glnxa64_installer.zip

./install -mode silent -agreeToLicense  yes

(2) 设置环境变量

vi ~/.bashrc增加

export LD_LIBRARY_PATH=/usr/local/MATLAB/MATLAB_Runtime/v93/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v93/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v93/sys/os/glnxa64

(3) 安装opengl

yum install mesa-libGLw.x86_64


备注:

如果不安装opengl会报错误:

------------------------------------------------------------------------

          std::terminate() detected at Sun Dec 17 10:54:48 2017

------------------------------------------------------------------------


Configuration:

  Crash Decoding      : Disabled - No sandbox or build area path

  Crash Mode          : continue (default)

  Default Encoding    : UTF-8

  GNU C Library       : 2.17 stable

  Host Name           : localhost.localdomain

  MATLAB Architecture : glnxa64

  MATLAB Root         : /usr/local/MATLAB/MATLAB_Runtime/v93

  MATLAB Version      : 9.3.0.713579 (R2017b)

  Operating System    : Linux 3.10.0-693.11.1.el7.x86_64 #1 SMP Mon Dec 4 23:52:40 UTC 2017 x86_64

  Processor ID        : x86 Family 6 Model 70 Stepping 1, GenuineIntel


(4) 安装jdk

jdk的版本最好严格匹配(大版本号、64位或),在matlab命令行中允许version -java,找到响应的jdk版本,然后oracle官网下载指定的版本。

安装完毕设置环境变量:

export JAVA_HOME=/home/jiangyb/apps/java/jdk1.8.0_121

export PATH=$PATH:$JAVA_HOME/bin


(5) 测试用例

import plotsin.*;


public class Main {

    public static void main(String[] args) {

        try {

            // System.setProperty("java.library.path","/Applications/MATLAB_R2017a.app/runtime/maci64/libmwmclmcrrt");

            PlotClass plot = new PlotClass();

            Object [] result=plot.plotsin(1, -2*Math.PI, 0.1f, 2 * Math.PI);

            System.out.println(result.length);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

(6) 编译


javac -cp /usr/local/MATLAB/MATLAB_Runtime/v93/toolbox/javabuilder/jar/javabuilder.jar:lib/plotsin.jar -d bin/ src/Main.java

备注:这里的lib/plotisn.jar就是刚才导出的jar包。/usr/local/MATLAB/MATLAB_Runtime/v93/toolbox/javabuilder/jar/javabuilder.jar则是安装完毕运行的jar包目录。

(7) 运行

java -cp bin:/usr/local/MATLAB/MATLAB_Runtime/v93/toolbox/javabuilder/jar/javabuilder.jar:lib/plotsin.jar  Main


(8) 输出结果


1 至 7 列


   -6.2832   -6.1832   -6.0832   -5.9832   -5.8832   -5.7832   -5.6832


  8 至 14 列


   -5.5832   -5.4832   -5.3832   -5.2832   -5.1832   -5.0832   -4.9832


  15 至 21 列


   -4.8832   -4.7832   -4.6832   -4.5832   -4.4832   -4.3832   -4.2832


  22 至 28 列


   -4.1832   -4.0832   -3.9832   -3.8832   -3.7832   -3.6832   -3.5832


  29 至 35 列


   -3.4832   -3.3832   -3.2832   -3.1832   -3.0832   -2.9832   -2.8832


  36 至 42 列


   -2.7832   -2.6832   -2.5832   -2.4832   -2.3832   -2.2832   -2.1832


  43 至 49 列


   -2.0832   -1.9832   -1.8832   -1.7832   -1.6832   -1.5832   -1.4832


  50 至 56 列


   -1.3832   -1.2832   -1.1832   -1.0832   -0.9832   -0.8832   -0.7832


  57 至 63 列


   -0.6832   -0.5832   -0.4832   -0.3832   -0.2832   -0.1832   -0.0832


  64 至 70 列


    0.0168    0.1168    0.2168    0.3168    0.4168    0.5168    0.6168


  71 至 77 列


    0.7168    0.8168    0.9168    1.0168    1.1168    1.2168    1.3168


  78 至 84 列


    1.4168    1.5168    1.6168    1.7168    1.8168    1.9168    2.0168


  85 至 91 列


    2.1168    2.2168    2.3168    2.4168    2.5168    2.6168    2.7168


  92 至 98 列


    2.8168    2.9168    3.0168    3.1168    3.2168    3.3168    3.4168


  99 至 105 列


    3.5168    3.6168    3.7168    3.8168    3.9168    4.0168    4.1168


  106 至 112 列


    4.2168    4.3168    4.4168    4.5168    4.6168    4.7168    4.8168


  113 至 119 列


    4.9168    5.0168    5.1168    5.2168    5.3168    5.4168    5.5168


  120 至 126 列


    5.6168    5.7168    5.8168    5.9168    6.0168    6.1168    6.2168


1


好了,总算调试通过了,下一步我准备在OSGi环境下使用。我们目前的分布式计算是基于OSGi环境的。

新手

5 麦片

财富积分


050


1

主题

2

帖子

0

最佳答案
 楼主| 发表于 2017-12-18 11:29:46 | 显示全部楼层
使用Matlab来开发算法,然后放到Java的集群中运行,这种做法还是不错的,拟补了Java服务端计算的某些不足。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表