EDA365电子论坛网

标题: Matlab函数的编写及java对该函数的调用 [打印本页]

作者: mytomorrow    时间: 2020-4-30 11:24
标题: Matlab函数的编写及java对该函数的调用

5 H( O+ a: L) L+ `4 C; F, G1 b一、matlab版本必须支持java
1 G9 f$ `) w  D( n# u$ v在command 模式下面运行deploytool,如果支持该命令即可使用
  W- k4 k" \' x& R
, y1 j# C+ i- i; [4 {
# y" h6 p- m. G9 v/ W; g
) \* P8 q" d+ ~二、matlab中function的书写
+ V2 A6 M" o- _+ a0 A3 M5 n
" \' l. x' z6 C% V, \%定义一个函数operation(a,b),求a与b的加减乘除运算,并返回结果
4 l3 @0 P2 n+ N3 a
( p3 E! `3 S" j7 ^%函数定义function 输出变量列表[s,m,...] 函数名(输入变量列表)sum,sub,mul,div中5 B: l0 p0 ?' k

( ^5 D) S  s7 q& ^4 }function [sum,sub,mul,div] = operation(a,b);. Y5 s8 U& `# P* F

5 p, \, M* q* m! {6 J: r% psum = a + b;( b1 h$ N) J. m. V: M

; T  o3 c; O& K  R9 A2 Osub = a - b;
! d8 a& Q- j" D! L7 j* \5 d  o! W; g3 a4 L
mul = a * b;& i4 f+ J, O3 d) k" J2 ?
9 q6 x1 V5 B7 u2 s
div = a / b;
" ^# E2 a' d( S! C5 {, s  M% |- q+ f0 m9 W
end! Z( B3 ?7 a* d- {# ]' y( g* H* y2 h% D& w
. g# z: C- f5 v( _2 `/ h3 ~
5 q+ Y5 G  K" V* I6 z
) g% f& J  \* u& x7 t
PS:上面标红的部分与java中调用该operation的返回值有关系,在java中调用的 Object result[] = XXX.operation(4,a,b); 4表示有4个返回值,分别存放在result[0]到result[4]中。. Z0 F1 ]6 H& T, V
/ q. `# Q% J  ]+ \

% r" S7 U9 I: _  [# X, u7 T$ s  j5 G
6 ]4 u* ?( l5 i1 x三、使用matlab编译生成jar
$ k* x! _: R2 {. N: u5 p在matlab命令窗口下输入 deploytool,就会弹出一个编译窗口,
- b' x5 d. ]  A; Z5 _5 Y9 l9 [  b: U% ~; e4 m
然后点击,file,选择new-deployment project,
/ l2 o5 g* d- \* `5 r! I$ z2 K9 ^# D8 g) d* n0 k4 P
然后选择matlab builder jave。; S" Q5 a  |8 ~- w$ w! a

  l! a0 o) U; L" i2 }name的地方填写工程名,+ L  ?# i# f) c1 H& c

$ @4 k0 e, Q- u( Jocation填写该工程的存储位置。* a) b  K- k# `: H( M3 X( ]
) |/ b5 p/ ?% w  w* g3 O
点击ok。4 _* P! s8 I2 U7 F, P; E

" n+ ~9 S( B8 ~1 D/ C, f然后,把m文件添加到工程中,先new一个class,这个class的名字就是你将来在java中需要new的class的名字,也就是matlab中operation所在的class名字然后将你的m文件添加到这个class目录下,然后直接build即可。- Z" a" n9 b- H; c
$ h6 p2 k' |2 s% v& f$ b
四、在java中使用matlab的函数
3 t) _0 L: _. t0 `现在eclipse下面new一个新的java工程,然后将第三部build成功后产生的文件夹下面的distrib目录中的XXX.jar 以及你matlab安装目录下/toolbox/javabuilder/jar/javabuilder.jar加入你的java工程extend lib 中去。4 s9 @: |2 y# L- ?
然后你可以清晰的看到XXX.jar中包含的函数和类5 Y& k! w0 [8 Q2 A% A3 u8 b4 J) n+ ~
" Y7 h/ |- ^: E  v, y
[java] view plaincopy$ g, l7 m$ O$ [, A
import com.mathworks.toolbox.javabuilder.MWException;  
3 Q% Z5 x( y3 J' v& c( n4 ]6 l+ B8 wimport com.mathworks.toolbox.javabuilder.MWNumericArray;  
5 A, ]( c& t' p3 j) aimport XXX.XXXX;  
2 u+ h1 m0 A6 j! N% f" `class Test {  
: j& I! g. R8 H9 {    public static void main(String[] args) {  ( u  v% A0 }! n+ U3 c- X3 u* L
        try {  . x( x% j; ^8 B. |( |
            XXXX abc=new XXXX();  ; E# |; X; |) i1 ]
                          
: Y$ ^# T3 }" ^            Object[] result = null; /* Stores the result */  0 i. d0 f: z3 P: m
            int a=10, b=2;  
  i2 U" D' }0 v: U8 I            result=abc.operation(4, a, b );  
2 r' {$ Z4 b9 k8 Y5 f, F& x  {. k  9 _3 L# T3 {( g: m2 r2 e. c9 o! @. {! a
            System.out.println(result[0].toString());  
* Y. N" m. h* k3 B# S2 {            System.out.println(result[1].toString());    S1 j" H1 L7 n9 f) A
            System.out.println(result[2].toString());  # x3 i1 @3 r  W! S  s
            System.out.println();  
/ G; E/ K( [9 |/ A4 R. f        } catch (MWException e1) {  
6 p- A: b7 O; t, @4 i0 z9 W            // TODO Auto-generated catch block   
) @' @; V  v7 e8 c9 h; h8 d            e1.printStackTrace();    A! e& H, d  V
        } finally {  9 f3 w$ K/ W0 |! |' p
            /* Free native resources */  ! W% a5 o; ?8 L# F
            System.gc();  & x/ z/ M5 K. a1 `8 s
        }  * L( P$ y% q* F, v1 g
    }  1 g& r9 |3 q# v0 ^. U$ X
import com.mathworks.toolbox.javabuilder.MWException;7 d4 b& _; `2 _$ x* V7 [
import com.mathworks.toolbox.javabuilder.MWNumericArray;0 `5 t8 Y3 M( o% X0 |& L1 L
import XXX.XXXX;# l" f+ T3 n1 j
class Test {
7 {* `  q# O% s& J! h        public static void main(String[] args) {
" l/ h% Y3 H' q- T2 o3 N* U1 c9 a                try {1 N( j' _  H- g% n2 f
                        XXXX abc=new XXXX();( H: a. ?5 l& G: u7 R8 a' G
                                                / I; B2 ^/ K4 d3 d( P, N
                        Object[] result = null; /* Stores the result */
, x- m- k1 ?3 _3 ?8 h( G                        int a=10, b=2;: T  l# E3 s4 j4 [) a1 C
                        result=abc.operation(4, a, b );
3 p, K6 y4 {5 I' W) B & x; P& a8 \+ I' h- u) V
                        System.out.println(result[0].toString());7 t' }; w. U/ Z7 M3 ~( D
                        System.out.println(result[1].toString());. e+ ?# y% \" {" R' m2 l
                        System.out.println(result[2].toString());  d5 i5 K. C+ A" m" y/ j! W% X
                        System.out.println();
* n' |- p5 S) F8 K                } catch (MWException e1) {
5 O2 |4 z5 h0 S! L& [- {                        // TODO Auto-generated catch block
( U+ x# [; W! i9 n" ?                        e1.printStackTrace();6 G: {6 Q& o1 F. r8 J& ]
                } finally {) L, W. ?- F& [5 o+ G
                        /* Free native resources */
2 I# M& ?, p! ?8 {# P8 D, z2 ^. a5 ^                        System.gc();- C; ~8 f6 y9 Y: x) r
                }3 b; y5 O, d- H; m1 C  Q5 R
        }
+ d6 r0 U3 Q  Y( y( Y* F: V) r
5 g, m& S3 w0 g; G如果result[0]返回的是一个数组,可以通过如下的方法解决' k& C4 I% w6 r
MWNumericArray a = new MWNumericArray(Double.valueOf(result[0].toString()),MWClassID.DOUBLE);
8 c) a: L% w. c4 E& n, C2 G  s. q' U6 |1 P
MWNumericArray temp = (MWNumericArray)result[0]; + U: e' y% c! m
( v: c' O. n  j1 i+ E+ p
float [][] weights=(float[][])temp.toFloatArray();
8 H& b6 R6 f  \0 N1 n$ ?6 F5 h' e8 {( w+ `- Y& n6 d9 W5 m" w3 h
0 h* R6 b/ X: S( t# @+ X
五、可能碰到的问题
* x; ]: b2 _) ^5 R3 m# EException in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.13, required by MATLAB Builder JA, on java.library.path.9 G$ T5 t- {% s+ x+ f8 Z; T0 U
This library is typically installed along with MATLAB or the MCR, its absence may indicate an issue with that installation or the current path configuration.  ?2 P* v; k; W6 @4 l- @
The MCR version that this component is trying to use is: 7.13.# t  e! p3 {# Q6 k

* l0 i5 x; x8 |0 {( E+ W* v8 ?$ m1 B; N- W) h# k% v% k% j, q
Failed to find the library mclmcrrt710.dll,required by MATLAB Builder JA, on java.library.path8 L0 F/ [/ p) m3 q; ]2 p( D
! @$ r$ Z0 N7 P+ u' x

1 v0 Z# Y. F+ ?; r* W6 H( \( C' w% a' j
原因是2009a要对应安装mclmcrrt7.10。在MATLAB安装目录下查找:\toolbox\compiler\deploy\win32,找到MCRInstaller.exe 安装,重启Eclipse即可。
作者: CCxiaom    时间: 2020-4-30 13:58
Matlab函数的编写及java对该函数的调用




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2