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

Matlab函数的编写及java对该函数的调用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-30 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
5 z2 I$ g% B. I( r
一、matlab版本必须支持java' N6 u* l4 p$ W, O6 T" m4 C( o1 m8 ^
在command 模式下面运行deploytool,如果支持该命令即可使用
5 W! U% R& A5 a$ t
3 V/ t- I: K9 t; ?. i1 t
8 ~8 e5 P+ v1 _$ y
$ ?# O% {! t3 a0 K$ [9 ]二、matlab中function的书写4 E! l0 k. Z/ y7 M& _: G! b1 I

% J! }# Z1 D5 E1 I  r%定义一个函数operation(a,b),求a与b的加减乘除运算,并返回结果
5 t- R9 Y2 I) |6 d; [; l( u% J, p& a: ?4 }. f/ O
%函数定义function 输出变量列表[s,m,...] 函数名(输入变量列表)sum,sub,mul,div中
. }! k$ `- g( F$ q) |4 O7 G3 m3 s/ F/ U, Y# F2 R' @/ q7 g) j
function [sum,sub,mul,div] = operation(a,b);& k, A" l. q1 E$ F/ Z: y

! Q+ h7 \% c5 f$ O! Y3 Z5 k* k3 E# Lsum = a + b;
# }' |; Z2 b# r$ l9 C% ?
4 y& {( |# t# ]# E! {4 Asub = a - b;6 [- N6 n6 l5 `9 ^! W0 Q; X

- V, j: i6 `7 z, P2 T9 M/ D7 Z- ?mul = a * b;
, D! [- e& _8 L( Z3 N9 k4 u! B' d4 a6 |
div = a / b;
! s% u0 \% A! ]+ q
3 E$ z- t6 \; L8 n3 H& c$ Wend7 I$ _9 g7 l5 ^: |! o
8 Z- [, n3 O: u. T3 S

2 }* S2 O" R4 B4 E- Q9 e! |% j( t
PS:上面标红的部分与java中调用该operation的返回值有关系,在java中调用的 Object result[] = XXX.operation(4,a,b); 4表示有4个返回值,分别存放在result[0]到result[4]中。
% s, ]3 m! q( h  e/ t$ Z  e& W
" p+ c" d! C4 Y4 y* O+ X  _: ^" L  h  z  S

3 u; A9 `2 `5 `) ]三、使用matlab编译生成jar
$ Y) b- O* }, o3 |  R3 |+ F在matlab命令窗口下输入 deploytool,就会弹出一个编译窗口,
9 x9 o) {: C  ?, J0 ~1 d! U+ ^' O0 q* ~
然后点击,file,选择new-deployment project,, l! e# {( _- V8 z0 ]

" m2 E7 _# ?/ O* I; E4 J! z然后选择matlab builder jave。
+ {4 k0 q5 n1 I
$ p) r( O" F0 Jname的地方填写工程名,
: b7 x  }8 m/ B$ D. h7 L
# T% s  Q, r# k9 a3 O- B" n, ~ocation填写该工程的存储位置。* ]( V7 s/ J' Y7 F3 }5 J

8 t6 r( ]. e" d/ l) r点击ok。! s/ z% {9 f- r, J! y4 s0 ]

4 O+ Y7 f1 m! ~) v' C5 l# d然后,把m文件添加到工程中,先new一个class,这个class的名字就是你将来在java中需要new的class的名字,也就是matlab中operation所在的class名字然后将你的m文件添加到这个class目录下,然后直接build即可。
6 x# S' j. ^' }# B6 Z: M( ]+ g: T' S- L& [1 Y- e1 F
四、在java中使用matlab的函数
1 D0 v/ g+ _5 Y9 I现在eclipse下面new一个新的java工程,然后将第三部build成功后产生的文件夹下面的distrib目录中的XXX.jar 以及你matlab安装目录下/toolbox/javabuilder/jar/javabuilder.jar加入你的java工程extend lib 中去。
! J8 U, j: `. q1 n5 w3 C然后你可以清晰的看到XXX.jar中包含的函数和类4 q  }8 d) Y6 m/ t' O: q- ~, A
9 j3 [, w$ j, Q+ C, S' }
[java] view plaincopy
' S3 t7 l8 c- o4 X- T4 F' e2 ]3 g# |import com.mathworks.toolbox.javabuilder.MWException;  
2 a* A4 D4 C- E, S  K' m) i% ]5 Mimport com.mathworks.toolbox.javabuilder.MWNumericArray;  
" X. ?' \8 D* O) M( w3 timport XXX.XXXX;  
, q: e. Q8 y. O6 k- T% ?. fclass Test {  ! V9 q" L6 p" P( R% X$ z0 Z
    public static void main(String[] args) {  
1 k& m& F! |% n9 [        try {  
2 U  u, ~( f! ]- ]3 f2 |            XXXX abc=new XXXX();  " M1 {8 b/ J. S3 f$ j! u# x
                          # A1 n4 M; M7 O
            Object[] result = null; /* Stores the result */  
0 p( q- ?9 t- K- g6 L4 T( n5 O: B) C            int a=10, b=2;    L# o/ l- y2 a
            result=abc.operation(4, a, b );  
; l2 G/ \4 q! @5 k7 W8 P# o  
: o4 n; m& c/ W            System.out.println(result[0].toString());  % n/ h: C5 }( d' C% a
            System.out.println(result[1].toString());  
2 _3 M+ ?% o' O, o3 e            System.out.println(result[2].toString());  
6 H+ }$ l0 F8 _% P            System.out.println();  5 z5 `8 G" x, b! G1 H( P
        } catch (MWException e1) {  
. E" ]  P6 `* [% }. {, k            // TODO Auto-generated catch block   
- B1 l( p" u7 u& E: b# n  J            e1.printStackTrace();  
4 H/ @2 m0 a3 n, U$ E. \        } finally {  . @$ d! G4 A# S' D
            /* Free native resources */  * T, ^1 D: y. i
            System.gc();  ; e, }; `8 K2 o# `2 F" F4 ?
        }  7 d+ d  a1 P% Q3 k
    }  
% t4 [: M9 R6 n5 jimport com.mathworks.toolbox.javabuilder.MWException;
! T: K/ H, k* B6 @+ y& kimport com.mathworks.toolbox.javabuilder.MWNumericArray;* p' `0 [9 o+ \
import XXX.XXXX;
) B8 t6 z' j9 T% H) A) V% N' o/ `6 _class Test {
) u7 j3 v. f1 h2 N        public static void main(String[] args) {
7 S& R: p. x- g1 l* L2 k                try {
5 J4 p1 l& p& M                        XXXX abc=new XXXX();
6 X7 C# ^5 b" e, G7 `- a                                                
. m9 A5 R# }: S4 E' S. E                        Object[] result = null; /* Stores the result */
4 F4 k& ^) w' z$ p+ ^- A3 D                        int a=10, b=2;& q) D1 M) ^) m2 Y' s
                        result=abc.operation(4, a, b );6 \' o3 T% c' p- K) ~- n
% ~% N/ V4 C5 y
                        System.out.println(result[0].toString());
0 I7 u3 U$ o' W; c2 i0 I9 b                        System.out.println(result[1].toString());
+ ^' ^1 k! U3 F' R) g- @                        System.out.println(result[2].toString());
7 N' x% D' i$ f7 z  Q8 v                        System.out.println();  d# V5 N# _4 \/ X5 V! I
                } catch (MWException e1) {
7 g# p9 z0 a2 h* G& \- S                        // TODO Auto-generated catch block, ]; R% A. }% h+ x) v, z1 t1 c
                        e1.printStackTrace();
* p6 ~( k/ y- W4 M                } finally {
, e7 l, E; r( k                        /* Free native resources */
' y% Y! d- |, u7 R# [* e                        System.gc();
8 Q' P4 b, M9 k- U                }
: q  P* d# Q4 L( a- H$ Y        }7 M! \' p; Y5 l) z, v" ?. ~4 O" y
2 A" X. B3 f% u$ [  U( Z; v% @
如果result[0]返回的是一个数组,可以通过如下的方法解决
9 ~( m* `% k4 j( y/ V8 b! B$ jMWNumericArray a = new MWNumericArray(Double.valueOf(result[0].toString()),MWClassID.DOUBLE);
0 W- ]0 g& W& r5 k8 r3 p  \1 b! x. V! G9 W
MWNumericArray temp = (MWNumericArray)result[0];
# {& G: R: b# E; G
& w. H2 I7 }+ ]- z, O. Lfloat [][] weights=(float[][])temp.toFloatArray();
* t" F* N9 M8 {/ u6 u# R
. |4 G" _; ^% p5 |5 `
; D5 K' C% i3 ?. ^五、可能碰到的问题
. F: w- p# }$ b: SException in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.13, required by MATLAB Builder JA, on java.library.path.* a6 }; J0 `: e( V
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.
9 K; r! k3 F2 a& [9 iThe MCR version that this component is trying to use is: 7.13.
- ?: y* b, I/ Z  D) j2 q, C- {5 b2 ]! S8 ]
+ ?6 d' F6 f* @# \7 h; v0 D- X
Failed to find the library mclmcrrt710.dll,required by MATLAB Builder JA, on java.library.path
* I7 e6 |' Y) _: ]
9 w, k$ V$ A& w! M' [' p: ?) E
! g) h9 z# X% R! {
* V6 Y  o- Q% e8 x0 k原因是2009a要对应安装mclmcrrt7.10。在MATLAB安装目录下查找:\toolbox\compiler\deploy\win32,找到MCRInstaller.exe 安装,重启Eclipse即可。

该用户从未签到

2#
发表于 2020-4-30 13:58 | 只看该作者
Matlab函数的编写及java对该函数的调用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-6 13:10 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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