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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
% l( w7 g% k" m5 a
一、matlab版本必须支持java0 |/ m4 U7 m; L) `* Q% @+ |* p& P( ^
在command 模式下面运行deploytool,如果支持该命令即可使用
2 G7 ?* F( h# ?( l1 F
8 l. Y7 }2 t4 f7 ?$ |% T; G1 A/ n! s- D

$ Z6 F% k6 o: [0 J- W1 J二、matlab中function的书写
. v/ Y2 k1 T$ @- Y, Y
2 W: b+ \; X* r%定义一个函数operation(a,b),求a与b的加减乘除运算,并返回结果
5 r8 l! \  j+ B3 q0 d
+ s) r  T! I" t- h; e5 i%函数定义function 输出变量列表[s,m,...] 函数名(输入变量列表)sum,sub,mul,div中
, ?+ W8 l. N6 k7 @7 p
$ k% x8 ?3 S9 Gfunction [sum,sub,mul,div] = operation(a,b);
- b8 ]$ f+ S, v& a6 V- a) R7 V9 T2 \* r# @- D# }
sum = a + b;
, c* L/ u1 J" F2 m7 q1 \) W* S' X0 Y! o& w
sub = a - b;; y7 t* ]# ]- o6 P7 ]0 j
. r3 i' {! B% Y: j5 l- V2 e; v! Y% A
mul = a * b;" B% \: D: {0 H! F8 j
! W7 t* K2 [& p9 x3 }8 G1 D. I' {) s5 w- a* j
div = a / b;
* D3 a, d: n$ W: U. w* T7 n0 M
6 m* L) K/ q- I& w' a/ D; @- F! |end, ?) M6 z2 d% \2 P5 a
: s9 Q/ b* t; ]$ _4 f! X" V

8 a7 Y7 @2 s' F' R/ w; f' h& n  |* K
5 m& G) h1 s  W" ]9 I9 ~3 n( r! UPS:上面标红的部分与java中调用该operation的返回值有关系,在java中调用的 Object result[] = XXX.operation(4,a,b); 4表示有4个返回值,分别存放在result[0]到result[4]中。
# E+ G, K' j) [. o5 X* ^4 @2 O
( [) L+ C% v7 W; s9 r& K
) t) O' P6 L5 W% ^
9 e" o% }2 A6 ?! |6 W三、使用matlab编译生成jar
; C0 Q9 c/ O6 ]6 L在matlab命令窗口下输入 deploytool,就会弹出一个编译窗口,
5 f& R" S& R0 r  Z# Q5 ?. _
7 Z, P% J  q2 K8 }( N5 e然后点击,file,选择new-deployment project,
& y# q9 L% V" p, x' O/ {# C8 ~) b* f
然后选择matlab builder jave。
$ Q/ \( |, K3 y# D& A3 V& B+ n0 o0 _( \* ]7 p# a" \5 N
name的地方填写工程名,% V; M" T* h6 M' `: R+ N
7 `# a$ ], n  k  J6 O* h2 V/ t
ocation填写该工程的存储位置。' m. B$ |3 M! P. T

# G& e  N+ }  u3 K点击ok。
8 d* A9 s6 c, ?" h  s. Z$ `/ \
8 i$ K8 Z; x1 ^. w然后,把m文件添加到工程中,先new一个class,这个class的名字就是你将来在java中需要new的class的名字,也就是matlab中operation所在的class名字然后将你的m文件添加到这个class目录下,然后直接build即可。+ G2 k  N) ?8 [! I' L) x
, I& y3 Z  ]2 q3 D
四、在java中使用matlab的函数& X& y' ]& o" g& S
现在eclipse下面new一个新的java工程,然后将第三部build成功后产生的文件夹下面的distrib目录中的XXX.jar 以及你matlab安装目录下/toolbox/javabuilder/jar/javabuilder.jar加入你的java工程extend lib 中去。
' y6 ?, W, g+ B3 d" i* I- Y然后你可以清晰的看到XXX.jar中包含的函数和类" y/ a5 P) f' ]  H
/ g- J$ U9 ?) t3 O& j5 z; ^) X; z
[java] view plaincopy" c( V& v/ g- H* E' H' U. \: X0 J5 s
import com.mathworks.toolbox.javabuilder.MWException;  + v+ D8 _3 H$ ]
import com.mathworks.toolbox.javabuilder.MWNumericArray;  
, r+ w: L# I) w3 S+ o1 Eimport XXX.XXXX;  
2 [: d' t# ?, X# i2 e6 f# mclass Test {  
3 P1 P4 L: E4 R& V& {  ~: L+ {    public static void main(String[] args) {  
* f: V" G' t( v$ E        try {  / g2 {1 A& `5 Q, w  X2 P! C
            XXXX abc=new XXXX();  ) y3 I; I, k9 ^( c1 y& Q. Z8 P$ f: M+ H
                          0 X9 y# _- h2 ~3 m! N
            Object[] result = null; /* Stores the result */  
1 p; m3 `/ K7 h( H5 J9 J. T5 P            int a=10, b=2;  
# t9 N- T! w* z1 y" o9 l% q            result=abc.operation(4, a, b );  
/ W( ~+ `' @$ s  
& e' Q1 ^# ]  ?( ~% h3 Q            System.out.println(result[0].toString());  
# g; Q0 j7 V0 d5 ^& S% ~( y" p0 e            System.out.println(result[1].toString());  + j+ k- ~# K: I& h1 @. G3 e" J
            System.out.println(result[2].toString());  
, f) {  A' R# e# ^  ^* R& O            System.out.println();  ) @0 I4 I4 T! S
        } catch (MWException e1) {  
+ o% O' _+ G/ v$ I+ ?- p. {            // TODO Auto-generated catch block   ( F; u) d. v  R" s  y
            e1.printStackTrace();  # t0 z5 I2 W% u
        } finally {  / R- }8 o8 w. p2 U) q! P* K% Y; G
            /* Free native resources */  6 h" n' R; X5 H$ A" ]; W
            System.gc();  
9 W9 q- R7 g" z, w        }  
+ n' ]/ w" n9 |8 z; p! X) x    }  
7 c# Q. i' W4 ]4 Y8 n; timport com.mathworks.toolbox.javabuilder.MWException;, f( j7 P+ ?  ~. d6 m1 d- |
import com.mathworks.toolbox.javabuilder.MWNumericArray;) `, }/ i( k( A( R+ v
import XXX.XXXX;0 ~, P! r3 p/ S7 Q
class Test {
9 p1 G3 ]2 u6 u+ r        public static void main(String[] args) {" _3 B# y5 h0 J8 k# R
                try {
) b7 i  o; {1 s8 Q" n* Z  {                        XXXX abc=new XXXX();
: n; j7 E1 |8 E                                                5 R( }6 W* j  M+ ?5 j# r- x, C. D
                        Object[] result = null; /* Stores the result */7 o  O! \1 e9 i% Z% h2 `( s
                        int a=10, b=2;
- q3 O' N) p0 ]/ ?1 |& v9 x. y                        result=abc.operation(4, a, b );
; e- |2 _" T& X3 { + u- U) |6 o' \/ F! X, d' `8 C7 z
                        System.out.println(result[0].toString());
+ [+ j6 ]: Q4 d. a$ M                        System.out.println(result[1].toString());
$ T$ p& P  f% a8 E6 \                        System.out.println(result[2].toString());5 O& @1 k9 E2 T* T. l3 W  g
                        System.out.println();# F% z8 w- H2 ]+ K0 c
                } catch (MWException e1) {
- Q; |  ]' ?1 B& S# |0 q4 }                        // TODO Auto-generated catch block
+ q8 E6 R  I% X4 [# L4 A                        e1.printStackTrace();
2 z* D9 w0 F0 Y! I! E  b5 L                } finally {
& G/ |1 X) K+ V4 V# S$ P' A                        /* Free native resources */9 V* ?" S8 g$ J! x- G$ a
                        System.gc();
, K* E9 r( k; D                }
. l& w' J! h! {* l3 I! Y        }; }  R- H. o: r* {1 d8 c

! O" t4 ^4 w) Q! o- v如果result[0]返回的是一个数组,可以通过如下的方法解决- t7 L! _7 A& `( v' z& f% A
MWNumericArray a = new MWNumericArray(Double.valueOf(result[0].toString()),MWClassID.DOUBLE);: S( v$ d5 D5 n7 B: {" ?: T; p

# _2 }& s# }9 H: ^" p* IMWNumericArray temp = (MWNumericArray)result[0];
2 c6 O! d) Z  C
( i& T% U, _$ c& B2 C0 m# e) dfloat [][] weights=(float[][])temp.toFloatArray();" \' z& w9 u0 |+ }
' ~; ?* t$ b3 c8 W3 e
' X2 ~$ ^1 v0 m6 J  V# v! l
五、可能碰到的问题
. G4 \0 m+ ?% zException in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.13, required by MATLAB Builder JA, on java.library.path.' \8 v/ n0 B) j9 g
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.% E0 o# |0 Y) }: R
The MCR version that this component is trying to use is: 7.13.
' d0 M' v/ x3 ~
1 |# [  c& D* _6 _+ z; l+ v) N4 l; U2 d+ f3 E" o, o! K
Failed to find the library mclmcrrt710.dll,required by MATLAB Builder JA, on java.library.path
; u  |% y4 ?& x1 `/ u) }
4 u7 H, M; `  S: \* J1 X5 J& j+ n8 C; i; d

* m$ G1 _, \) G1 ^原因是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-24 17:44 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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