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

Java调用Matlab程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
背景. m$ U3 I1 J6 A& F" m
Matlab可以轻易处理非常复杂的数学计算,Java具有多变的应用场景,如Web开发。本文讲述如何将两者优势结合起来,基本思路是将Matlab核心程序打包成Jar,供普通的Java程序调用。' X4 H% y* y5 e2 B, R' M2 t

. X( D/ p, I) _. d  y具体步骤/ J/ a9 p8 I& |  a. P4 I
1. 检查Matlab内置的Java版本和系统安装的Java版本是否一致?
8 }4 j! u0 U, D: O% X
3 T# h2 i4 g3 k  a- P检查MATLAB内置的Java版本
! `! R7 U$ o# {- k) O3 G+ ~4 j) X( Y) F 0 p: S  O% s8 p, C6 i+ c% t# w
( O5 l6 N  \( s: d! B
检查系统的Java版本
9 @3 Y9 q6 Y' C" K$ d# |: S ; g; x; A4 G  f1 y9 A" w: ]

- \. p" \4 N  E  e; B1 F2. 准备一份要调用的Matlab代码
, Q3 u: W2 k* V! ~( |% {* v/ y3 ]4 t, K0 v, k9 _2 b
为了测试各种数据类型(如Matlab的矩阵数据类型)的使用,本文采用稍稍复杂的Matlab测试程序:基于测距的网络定位。其包含多个M文件,其中主函数代码如下。输入参数7个:gCov是矩阵,其他为标量。输出参数2个,都是矩阵。
8 \6 B6 B2 z( S5 Y
5 c1 r$ |3 q7 P5 R! Lfunction [ nodeLoc, pMds ] = main_localization( N,  dim, space, nGps, gCov, sigma, numMiss )  x7 J! Y, b2 `6 P) f
3 @/ W, H8 l4 L, j9 W
    nodeLoc = diag(ones(dim,1)*space)*(rand(dim,N)-0.5);5 s2 n# h# S. n, o9 f
    dltSec  = zeros(N,1);, w* J) y! K5 G3 C

1 Z9 i$ z2 r1 u* }0 o' c& j    achrIdx = 1:nGps;1 O7 `0 e8 C: R- ~$ G5 M
    covMats = zeros(dim,dim,nGps);+ @- `' h7 @! J) b% T
    for n = 1:nGps
+ d! h( ~7 d, G& m" g" ~        covMats(:,:,n) = gCov;8 C" ~3 k) T4 o
    end9 w3 ^7 C) `4 f5 a2 f+ p, p

  T) q- b. y% d! ]' l    [CT,CR] = round_robin(nodeLoc,dltSec,sigma);
* F7 ]: C$ X' S+ L4 X    [A,~,y] = gen_Ay(CT,CR,ones(N));
9 u7 o  w' f' I0 u6 t. m+ f
& Q( c- w! o: [7 P9 `" n    connMat = gen_connMat(N,numMiss);
  F# L1 w8 J" ~! h2 |) e9 P& u' I2 K! m& \- L
    dltEst = est_dlt_ls(A,y,connMat);1 Y& ?/ e" r- b+ Y
    distVec = y-A*dltEst;
' C. o8 h) i  ]+ }
4 h2 G, M/ C( B0 G& V    distMat = diag_vec2mat(distVec);% I; W- V! ^& W! m
    edm = distMat.^2;) K4 q) ^! U3 D. H" I/ q! V
$ J$ w3 T7 i$ z  w9 X6 t4 n# Z
    pGps = mvnrnd(nodeLoc(:,achrIdx)',gCov)';& f9 i. J1 E8 J9 e2 R! ?
) G) j" [8 c" O/ N# t, U
    pMds = classic_mds(edm, dim);  C7 R  a% _2 b: O0 I
    pMds = orthogonal_procrustes(pMds, pGps, achrIdx);7 Q; b8 E- p) U8 o
end
. _$ d5 ?. O+ f9 Z% B2 m  [4 u! S3 I% \% d

) j% O, Z: A0 I其他多个M文件列表如下图所示:$ V! l) B( u' k# ]

) w( E  d$ b0 n! V, e. q
$ s. h: E) I8 p1 [$ d3. 将Matlab代码打包成Jar包( j; y7 Y5 C3 x; A) s
/ s9 S6 H! ]4 ]
(1) 在Matlab命令行窗口输入deploytool指令,唤起打包部署工具
; ]( m% Y4 {+ ?+ f
" s' R' w0 ~$ S6 n+ z- j  ^8 Y7 ?7 h. O6 r; w5 S7 B5 q3 h
(2) 配置打包类型、包名、类名;选择待打包的M的文件& {) q% R6 ^' `7 t% B4 g

$ |; k2 o, t5 ^  [5 T) e( f( h( \; T) F; ]  R
(3) 等待打包完成,应有3个对勾
' v. n0 L! S7 r# [1 M& Y& K% E9 |
6 ~3 i1 _! N( }; o) N
7 x! v7 m; f8 ]; P7 M(4) 打包生成的工程目录结构如下
4 j! e" ?. n! F9 e. x" T1 D* j" W 1 }$ R) z: i' n. @

- k" k. [/ z" ~) D! ^0 j0 k4. 新建Java项目,调用由Matlab得到的Jar包
; a2 s% J( C6 c1 K6 z/ V  A
" M9 q$ G6 a) g9 ?- S(1) Eclipse新建Java项目(不赘述)
0 o1 u* ]5 w$ g* q, T/ M(2) 添加两个Jar包到Java项目中, Q, ?, i/ Y2 u; k. V% Z

6 s6 I, Y% j) b% {
  • Matlab安装目录下的Jar包:...\MATLAB\R2017a\toolbox\javabuilder\jar\javabuilder.jar
  • 前面M文件生成的Jar包:...\localization_matlab\for_redistribution_files_only\localization_matlab.jar: `* U2 C% L, B/ `7 O
( |( S, ?7 k$ C6 c0 h
. G9 O5 ]; J) G% N5 J

1 x6 U6 l! I: v: I7 o1 v( w(3) 写Java程序调用Matlab生成的Jar包,源码如下:4 h0 c% u7 a! _7 _8 L. G
: ^. i3 ~* P* t
package com.csrl.localization;: S$ N) m8 A/ k
2 t# [' }7 T, v; _
import com.mathworks.toolbox.javabuilder.MWClassID;
) a* s7 q) x' m# I9 f' `$ ?! Wimport com.mathworks.toolbox.javabuilder.MWException;
# l1 e: x, f7 U' Uimport com.mathworks.toolbox.javabuilder.MWNumericArray;
# L2 h/ c3 _: pimport localization_matlab.MdsLocalization;1 R# V; |+ D% g1 O& Q3 d

" f$ H) l2 x+ r, a0 V; Wpublic class TestLocalization {
5 _& h7 E7 c& B4 D; }
* c6 C. n$ h' a5 l5 O: F    public static void main(String[] args) {
1 P, \; a- B6 F4 L" V  B        try {
2 |8 c1 d1 @: ^* _- `            MdsLocalization matrixCompletion = new MdsLocalization();$ U( m* P2 ~+ Y3 O' [; j
% c1 D+ R. u& s6 s$ v; U# Q
            double N = 10;7 |9 {, T! N" c% h! G+ e4 Q6 r/ s
            double dim = 2;  N3 t1 S, \3 N) U+ m* w
            double space = 500;- _8 L% I4 T* W( F' G& b
            double sigma = 2;% x( I# v& R% G  \0 w
            double nGps = 5;" C5 F) }( u6 c9 ?9 m
            double numMiss = 0;; K1 |- h3 q- ]; n* M! L; X  R
            double[][] gCovArr = {{1,0},{0,1}};
, k+ D: G( ]. {7 r! [' b$ D& i            MWNumericArray gCov = new MWNumericArray(gCovArr,MWClassID.DOUBLE);         // 将二维数组转化为矩阵( ^3 g1 Y: P( ]2 S: n. Z

: Z. e' G6 @% N: X) w                        // 第一个参数“2”代表原Matlab函数输出参数的个数,后面的都是原Mat了吧函数输入参数;输出参数用Object数组保存! J3 {8 U; q: m& {
            Object[] result = matrixCompletion.main_localization(2, N,  dim, space, nGps, gCov, sigma, numMiss);
. L' R/ I4 O" t1 Q2 Y" _9 P" p8 Q2 s9 t/ g
            MWNumericArray data = (MWNumericArray) result[0];                                        // 第一个输出参数$ n! ]0 a. V9 l! ^, F( [1 W  D
            double[][] nodeLoc = (double[][]) data.toDoubleArray();                    // 将矩阵转化为二维数组
  q9 k! X( T1 X' @; w* A; [3 E8 C' T  a/ X; i9 L
            data = (MWNumericArray) result[1];                                                                        // 第二个输出参数: S" x- p" _& X# B, N0 P! ~
            double[][] pMds = (double[][]) data.toDoubleArray();                // 将矩阵转化为二维数组3 s# K# ^) g  P
% T, z# N4 f& a; s0 R6 w6 h  y
            System.out.println(result[0]);                                                                                // 同Matlab输出格式,输出矩阵* U" |; \+ f" K( u7 L
            System.out.println(result[1]);
* |" Z3 Y. a  p# o  V4 F* ?. |
' S9 Z8 F( f/ S. C( j1 o2 @0 a            System.out.println(nodeLoc[0][0]);                                                                        // 通过二维数组索引输出矩阵中某个元素% e- X1 c0 I" Q' @% }# ^7 X- i# m) E
            System.out.println(pMds[0][0]);
" h8 k% p* z" ~
2 g) D* }5 [: @6 C2 x6 U# e        } catch (MWException e) {+ L5 Z% I! |, v# C6 l- J/ K
            e.printStackTrace();: ^+ S$ H1 w0 Z$ C/ x- ]& z6 A+ a
        }
8 \$ L& k# w/ a    }  J- n" b6 ]4 D# w( ]2 I, Z
}
% t) W1 {, D+ X/ g& L
1 H& Q; z3 D  H( l) G3 |' b9 z
2 C1 s7 z8 @1 V' P6 y0 p
- n$ Q$ A" k2 O) w* V9 t7 S- a9 D

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 15:19 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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