找回密码
 注册
关于网站域名变更的通知
查看: 366|回复: 1
打印 上一主题 下一主题

Java调用Matlab程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-5-6 10:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
背景5 D) {3 B( J" H, m" E+ G
Matlab可以轻易处理非常复杂的数学计算,Java具有多变的应用场景,如Web开发。本文讲述如何将两者优势结合起来,基本思路是将Matlab核心程序打包成Jar,供普通的Java程序调用。
0 W! {: d( R& K
, X7 M2 z- f9 M! n具体步骤, X- c7 {" J8 z
1. 检查Matlab内置的Java版本和系统安装的Java版本是否一致?
- m; _1 d; @# |$ _; `- v4 t: h6 e' p( f  W( z
检查MATLAB内置的Java版本
7 p& T. d/ M9 x2 w
# r; N) @5 Q) g) h) g" k, s3 K$ {: j1 l4 L: S- Q8 c" S+ \7 Y$ M
检查系统的Java版本* W+ [. u, w% w" _3 Y4 u

/ l: d) ]  h0 ?
3 |) H: y) R$ n+ k$ `* G2. 准备一份要调用的Matlab代码7 Y6 Z! ?2 \) s$ F2 c
" \1 s% F$ e# a2 A4 z/ h  X! R
为了测试各种数据类型(如Matlab的矩阵数据类型)的使用,本文采用稍稍复杂的Matlab测试程序:基于测距的网络定位。其包含多个M文件,其中主函数代码如下。输入参数7个:gCov是矩阵,其他为标量。输出参数2个,都是矩阵。
1 W# |9 B: \7 q) e' g+ Y) Y" m; C1 p9 i0 \
function [ nodeLoc, pMds ] = main_localization( N,  dim, space, nGps, gCov, sigma, numMiss )
8 n& V# O, i% U) R8 z& n2 Y. {4 ]) d7 Q+ ]/ A. O7 }6 k& }" Y4 N" u
    nodeLoc = diag(ones(dim,1)*space)*(rand(dim,N)-0.5);
/ ]1 D% T' j- z    dltSec  = zeros(N,1);
! `9 G, f. ^- o/ @2 u' M7 K4 z9 \$ ?9 \" e  X- n8 K8 v
    achrIdx = 1:nGps;
' h7 _4 d; E5 j0 R9 m+ }9 b    covMats = zeros(dim,dim,nGps);
6 d" z5 K! M7 {% c    for n = 1:nGps0 W) E$ g# G0 L/ ^: U7 |, S1 [8 G
        covMats(:,:,n) = gCov;
5 Y9 E2 R% C6 {+ n1 K" c    end( {* s4 f$ }* \6 O
; H# l+ K! n2 F- I6 E
    [CT,CR] = round_robin(nodeLoc,dltSec,sigma);
( Z3 |& K. ~: f. H    [A,~,y] = gen_Ay(CT,CR,ones(N));
) c2 _4 z! R+ ]4 G0 u4 q! [2 ^" |5 o3 s. o- c1 Y/ k
    connMat = gen_connMat(N,numMiss);% U( H/ V! _% z$ p/ w0 e" Y! b
8 _( O& t) S  v4 F, v) i
    dltEst = est_dlt_ls(A,y,connMat);/ Y8 ~3 ?  F# }6 y8 v8 g
    distVec = y-A*dltEst;" R5 `8 k; H- W& s; g0 x4 h- K
$ q/ d$ N, t& W0 y! e4 K, v: s# `
    distMat = diag_vec2mat(distVec);
6 {% }# Y- F2 O7 M1 t! [/ t    edm = distMat.^2;( _3 U- \5 w* K+ C* Y0 d
. K. S' N5 w! E0 R% q3 W
    pGps = mvnrnd(nodeLoc(:,achrIdx)',gCov)';, m6 @7 p; M. G( B/ M5 ]3 I& @
2 D+ }0 B: \- |% x
    pMds = classic_mds(edm, dim);( p2 g+ [/ C( H" g  f0 K& f8 e$ g
    pMds = orthogonal_procrustes(pMds, pGps, achrIdx);- j" p1 X5 S! t' j
end; T# f$ m* W* _0 s4 x
/ Q2 O/ b; M& \$ A) T
" T$ n% f+ i: }4 e1 f
其他多个M文件列表如下图所示:/ R4 h/ @- k& _8 z1 z' E
4 u: U* M; \7 T: ~2 O5 m! D- `

* H& b# p: M: X: `3. 将Matlab代码打包成Jar包
+ h$ `9 h( s7 g3 p6 z3 G* |" x, W# ^5 A3 g
(1) 在Matlab命令行窗口输入deploytool指令,唤起打包部署工具% n% Z; |( c1 G7 A( K; |

( m9 [0 {4 ~' \# Q( i) _0 R% e3 l+ ^& Q5 R  n2 v
(2) 配置打包类型、包名、类名;选择待打包的M的文件# z- k: `. `, }& L

0 n3 f8 ^3 l3 m' E! p: _
; E5 h# M2 W, q# J+ _+ ]* z( S: M% i(3) 等待打包完成,应有3个对勾3 ]9 C1 E. ~; X% Q. f

0 \) F) u2 }6 K/ }% S  o% h6 t& C! t& V
(4) 打包生成的工程目录结构如下
6 ]; N1 Y( ~( L9 z/ \: U9 i
8 ^/ K! v" f# D9 U2 E
0 u$ h8 k0 L  F% \4. 新建Java项目,调用由Matlab得到的Jar包8 F- v: i6 n0 m$ |
' P. c& N! p. n1 K$ h' }3 G  @' K
(1) Eclipse新建Java项目(不赘述)
& B- K2 m: J8 \0 `% z(2) 添加两个Jar包到Java项目中6 V) f0 s7 W" _! Y) ^

0 k0 k: u2 h/ E
  • Matlab安装目录下的Jar包:...\MATLAB\R2017a\toolbox\javabuilder\jar\javabuilder.jar
  • 前面M文件生成的Jar包:...\localization_matlab\for_redistribution_files_only\localization_matlab.jar
    4 i6 X: Y; ]! X& ^' S; N
* y" w2 {& Q1 z/ P8 v  E
0 Y" B1 c" d! T5 ]" [/ g
4 y+ H! |9 i, ^3 x4 @+ L$ }
(3) 写Java程序调用Matlab生成的Jar包,源码如下:9 _  h- O% ?. C& b/ `- ^4 u
- t0 {  f' Y6 Z& p" `% Z
package com.csrl.localization;# Y/ a: |5 J5 `9 u+ \

% \4 d7 p; n0 i4 E/ c' {1 Nimport com.mathworks.toolbox.javabuilder.MWClassID;
0 Q$ u5 Q5 d2 v0 q6 @import com.mathworks.toolbox.javabuilder.MWException;
8 W' P) x* I! C2 Y# zimport com.mathworks.toolbox.javabuilder.MWNumericArray;
! y, S$ g; `* Kimport localization_matlab.MdsLocalization;6 i+ N& b4 D1 j6 r; }4 \/ z# ]

' b3 ^/ b0 _& F+ K  f+ {% F: Jpublic class TestLocalization {
1 e5 ~# u  `5 o; E* O
( J0 c/ t# M# m) ]8 Q' }- `, b6 O* L    public static void main(String[] args) {4 y0 o  w' F% P6 f
        try {
' I( L- ~7 e* m% V! o            MdsLocalization matrixCompletion = new MdsLocalization();7 v4 h# R" b" l) e% v! R

% S$ }, c8 z# Z  ?5 m1 V            double N = 10;, s9 A7 s9 a+ ]& ?  D
            double dim = 2;% Q1 m# z) _4 Q% @1 Y3 M
            double space = 500;
+ V! z. I3 s% n' a* _            double sigma = 2;% h+ q+ M3 k5 k
            double nGps = 5;
9 |, _9 |- v1 N' h            double numMiss = 0;
7 _& M5 ~* M$ c/ @0 p/ O. v( ~            double[][] gCovArr = {{1,0},{0,1}};
" x8 }5 E4 Y% Q0 U) ?            MWNumericArray gCov = new MWNumericArray(gCovArr,MWClassID.DOUBLE);         // 将二维数组转化为矩阵
: R% }5 b: H+ ~% q4 l" I- }6 h, _: S' d% M
                        // 第一个参数“2”代表原Matlab函数输出参数的个数,后面的都是原Mat了吧函数输入参数;输出参数用Object数组保存8 F0 V4 s' f0 _+ q
            Object[] result = matrixCompletion.main_localization(2, N,  dim, space, nGps, gCov, sigma, numMiss);
8 B- q: T( ]( P+ ]
0 M0 O8 F. a7 F9 T# z            MWNumericArray data = (MWNumericArray) result[0];                                        // 第一个输出参数
4 h2 ~3 G% c% D# d            double[][] nodeLoc = (double[][]) data.toDoubleArray();                    // 将矩阵转化为二维数组* z) B  U; Q* B

. Z! M. `7 k6 ]% ^2 I. @            data = (MWNumericArray) result[1];                                                                        // 第二个输出参数
0 ~# X' }# J$ E4 m  M            double[][] pMds = (double[][]) data.toDoubleArray();                // 将矩阵转化为二维数组* B2 H& Q: x; Z% {

0 O; O8 z+ o/ ]            System.out.println(result[0]);                                                                                // 同Matlab输出格式,输出矩阵
$ T  B) A& _+ V" r: N            System.out.println(result[1]);
0 O/ N, W3 _  a- G& U  e$ l. d4 u9 n  v" j$ [/ e4 S: J' T3 d
            System.out.println(nodeLoc[0][0]);                                                                        // 通过二维数组索引输出矩阵中某个元素; a: ]+ j% Z) v6 u+ b5 z/ t% |. j- v
            System.out.println(pMds[0][0]);
1 M+ A9 n3 y1 A! M$ i8 E" p+ r  z; R; v- \* b8 W
        } catch (MWException e) {
  e. p% I: [) _# U! ?' e            e.printStackTrace();+ b. Z- h) W1 N& L* k, y
        }" q' p5 M" M+ E- h
    }
8 M7 Z! J" ~; N# [& G% ^}
4 o* @- D, h2 x/ e# v
' s. \* r- v( `0 e8 u; ?4 W
) s! {$ f! S2 U2 V, h$ j% @- X. _3 J* N2 Y

该用户从未签到

2#
发表于 2020-5-6 14:04 | 只看该作者
Java调用Matlab程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-4 16:46 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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