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

Java调用Matlab程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
背景" ]& t* h' I0 D
Matlab可以轻易处理非常复杂的数学计算,Java具有多变的应用场景,如Web开发。本文讲述如何将两者优势结合起来,基本思路是将Matlab核心程序打包成Jar,供普通的Java程序调用。
0 q" O% F4 ~) g1 q2 B" q) h! P! ^
" p* m% d8 ^/ O1 O" c3 @) b具体步骤1 J- [6 ?# z  |" F
1. 检查Matlab内置的Java版本和系统安装的Java版本是否一致?3 q0 @/ M, _! q$ I
4 o: W4 \' ], {" w( m# v
检查MATLAB内置的Java版本
* W9 g# K! G! J" f  [2 Q
" E! m, i: A  ~5 z; q  ~1 U& R6 u+ \: o
检查系统的Java版本, y% L2 {7 [! N& a: s
4 I0 ^, C* R; Q
: {$ l' O( `: V2 i9 z. P  V
2. 准备一份要调用的Matlab代码8 d& v% X$ s" r
% S+ s* z' _# n9 r9 }# z+ }
为了测试各种数据类型(如Matlab的矩阵数据类型)的使用,本文采用稍稍复杂的Matlab测试程序:基于测距的网络定位。其包含多个M文件,其中主函数代码如下。输入参数7个:gCov是矩阵,其他为标量。输出参数2个,都是矩阵。, e( ~2 T2 X% t

, [4 }" {1 q& C( Efunction [ nodeLoc, pMds ] = main_localization( N,  dim, space, nGps, gCov, sigma, numMiss )
# ], S8 M8 |$ l; i' [) @. w
: R' K3 Z, j- z; a* P: t    nodeLoc = diag(ones(dim,1)*space)*(rand(dim,N)-0.5);
1 ?& C( K' b7 B1 T* G    dltSec  = zeros(N,1);
; Y7 e8 j) [" W/ m# z. X6 S
2 e7 ]" o" c9 q6 _; `* x    achrIdx = 1:nGps;* K" C4 N1 D+ U+ T- _, x: D3 l; _# I% c* V
    covMats = zeros(dim,dim,nGps);
  w$ M: ]0 o8 Z- ^* p    for n = 1:nGps& S0 L) [1 T5 E' D2 W
        covMats(:,:,n) = gCov;
* H3 S! C0 j2 ?" ?# D# E    end. \# a8 B+ U& O5 l
: b! B9 W2 d+ c! P% {8 Z
    [CT,CR] = round_robin(nodeLoc,dltSec,sigma);
, |9 R' c5 j0 [5 K    [A,~,y] = gen_Ay(CT,CR,ones(N));
! L- p  k+ p! F) K6 K" s* g9 H- d# _! @6 I
    connMat = gen_connMat(N,numMiss);0 u7 B$ s, |2 `- W) a1 \. u5 S* L
" w; Y" V- O; U7 C+ k
    dltEst = est_dlt_ls(A,y,connMat);3 ]" A$ o7 Q" {2 x
    distVec = y-A*dltEst;
" K& |9 H) v3 z3 k
+ }% Y4 _& s, |    distMat = diag_vec2mat(distVec);+ l" d3 p0 Y  K6 `3 c7 z# b& \
    edm = distMat.^2;
5 [% J6 v3 h* n8 q0 F
7 o% k' ~/ H' R    pGps = mvnrnd(nodeLoc(:,achrIdx)',gCov)';
/ Y/ l% w: L0 C( Y4 c0 u1 I0 @
: @# j$ s0 V. i, |* A    pMds = classic_mds(edm, dim);+ V$ V7 R6 w; D* Y& _. F1 Z1 T) D
    pMds = orthogonal_procrustes(pMds, pGps, achrIdx);
6 W, l2 s# m4 j9 `3 B5 _" g2 n1 hend( c' z9 F( m& J
; M) }6 x( P7 q" A' b
2 u3 N. n3 G# M! G, C+ M, x6 N7 [" o
其他多个M文件列表如下图所示:
( K# n; E* i4 O / E5 A2 {3 `9 ?4 {/ I, a
' `: i6 p# o! L
3. 将Matlab代码打包成Jar包
( Y9 e: v; c8 A/ ?
2 A, x2 A0 F$ T6 `5 t! c(1) 在Matlab命令行窗口输入deploytool指令,唤起打包部署工具
4 `$ \1 l1 O  V7 q8 z( M
! @! h& r- K7 G! y
* {6 w& J9 O- t7 m) y(2) 配置打包类型、包名、类名;选择待打包的M的文件
/ i" W3 o6 Z8 U+ Y. k7 x+ Z : ]( W6 w& s  n- W6 p  Z

2 q( g0 [  h) y+ _) c9 Z9 z- t) o(3) 等待打包完成,应有3个对勾0 p* x" a. ]  t2 L1 _" m
# }; B' c3 h3 _+ F( ]
- U0 O& u' l: Z1 M  D( h, g
(4) 打包生成的工程目录结构如下
" v) H/ M6 Q# ~3 {- ?$ a 4 }# E2 e8 d+ T3 A+ ^% @7 `

' `) p+ T2 I8 q! Q4. 新建Java项目,调用由Matlab得到的Jar包
' \6 E* ?* m, C6 P9 F" D. j* \' j# g
(1) Eclipse新建Java项目(不赘述)
7 ]$ _; [" h8 ~(2) 添加两个Jar包到Java项目中; u% B2 ]( N1 {, ?$ V

1 v2 d) |. j/ `, H, m4 ?4 H. e7 J+ G
  • Matlab安装目录下的Jar包:...\MATLAB\R2017a\toolbox\javabuilder\jar\javabuilder.jar
  • 前面M文件生成的Jar包:...\localization_matlab\for_redistribution_files_only\localization_matlab.jar6 n4 _! A+ t# ?; N* |

5 c; x' e1 B' F$ ^. L' _ % |2 l  y" h( ~, Q4 b# w% a
2 t" y/ D% L- i4 R: F
(3) 写Java程序调用Matlab生成的Jar包,源码如下:
) K7 v- [) \1 [' A
- n! x% @: d5 Ypackage com.csrl.localization;
* O- i  c: u4 W2 A: V) L) B3 ]0 J9 D5 ?# s) O
import com.mathworks.toolbox.javabuilder.MWClassID;
; v  Z  f  [% |, e2 Bimport com.mathworks.toolbox.javabuilder.MWException;  ^0 Y# ~: n- F+ D& T7 m/ p6 }
import com.mathworks.toolbox.javabuilder.MWNumericArray;
$ U! a8 w* k8 m* }) Z- A8 o5 Kimport localization_matlab.MdsLocalization;
" p' v  f% H5 f* k, l- r* ~4 ?& p
; G: i. u5 r5 h" a, kpublic class TestLocalization {
% r& d# X% G' N6 x; }
# m1 l3 K/ G; l% o+ q9 t6 R0 z4 [    public static void main(String[] args) {
  r; @/ k( l1 |. Q4 k# o: A        try {
* q! V& c# ]4 V3 ~2 c, Z            MdsLocalization matrixCompletion = new MdsLocalization();8 F4 ?% h) D) R  L) B

( r. Y9 ~1 K5 Z8 H, F8 B, v- w            double N = 10;
( h; e! _; @- I% r# L            double dim = 2;
. o) Y/ T7 {8 l5 G* \            double space = 500;/ N9 O0 J% \- J1 m* m
            double sigma = 2;" i! ~9 m4 W4 H
            double nGps = 5;: b, `% q+ q9 I$ {# ?5 |: O
            double numMiss = 0;
! x2 P4 d* P* S" a7 t* w8 q            double[][] gCovArr = {{1,0},{0,1}};  c1 k' }; k- M- A! \& b9 {
            MWNumericArray gCov = new MWNumericArray(gCovArr,MWClassID.DOUBLE);         // 将二维数组转化为矩阵
# S" t4 E4 v' l0 x( x( E4 A- O% Z( w6 s
                        // 第一个参数“2”代表原Matlab函数输出参数的个数,后面的都是原Mat了吧函数输入参数;输出参数用Object数组保存  O# O  ~1 {3 L9 P) G
            Object[] result = matrixCompletion.main_localization(2, N,  dim, space, nGps, gCov, sigma, numMiss);* J# n, c' W' q$ T1 o  q* R! l2 T$ e+ M

$ a" a% a5 e) [            MWNumericArray data = (MWNumericArray) result[0];                                        // 第一个输出参数
  j, V, X3 L1 `5 `            double[][] nodeLoc = (double[][]) data.toDoubleArray();                    // 将矩阵转化为二维数组
' A1 F9 S8 T$ U
4 V1 O8 J( y- v* I            data = (MWNumericArray) result[1];                                                                        // 第二个输出参数7 H/ B$ P$ [8 F/ k
            double[][] pMds = (double[][]) data.toDoubleArray();                // 将矩阵转化为二维数组4 S6 _+ h# ~+ m( s
4 w$ k$ d3 L6 n3 @) ?
            System.out.println(result[0]);                                                                                // 同Matlab输出格式,输出矩阵
0 q% g: Q2 l. e4 ?) w6 _! P            System.out.println(result[1]);
+ O( Y' p- C! `
1 m2 ~; P" n, X! \: V6 A; h! T            System.out.println(nodeLoc[0][0]);                                                                        // 通过二维数组索引输出矩阵中某个元素
  j, `6 i: Z. ]8 P            System.out.println(pMds[0][0]);3 e3 ^! i. F& D, W- h& E
3 L7 p! n* g. O2 p* ^
        } catch (MWException e) {+ V  T( U! M, L. p6 `& O* s
            e.printStackTrace();: e2 i' g! V6 v0 H& }: \# _+ C2 g
        }
) Y1 ]" A  N/ f    }3 m. w  G) W* w% a- o; e
}
3 q& S& E  u0 y' T" w! C8 U: F. l5 V8 G/ ^9 r  Z
% T% Y: l1 m6 f: ^  c

" S0 h% i1 t1 h/ e3 \5 W

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-22 13:55 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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