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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

: A; y- n9 C) d5 L* g- `一、matlab版本必须支持java
& v6 P/ \# i& R, V在command 模式下面运行deploytool,如果支持该命令即可使用
0 `2 y4 V. Q0 c, ?6 M5 X
1 X& W2 O% R& [) A
- F0 i. Y' r8 |! T
8 D8 Z. x- k. X( a" W二、matlab中function的书写
! a( |) u+ G5 D* u% I- v
  e4 M& X% P# ~%定义一个函数operation(a,b),求a与b的加减乘除运算,并返回结果
* A9 ^7 P& J" g8 w4 k
& |) X5 P3 u8 a! u%函数定义function 输出变量列表[s,m,...] 函数名(输入变量列表)sum,sub,mul,div中
* ]9 _% l( O# @5 ~# Z6 M4 \1 W5 O7 u0 W) u
function [sum,sub,mul,div] = operation(a,b);4 j; ~; ^5 i, T7 ^* f+ r
2 y2 W  s" q$ g7 q
sum = a + b;+ [, `+ g( ~* c4 g% H  `5 J

. u' A3 C/ Y; J& v/ _; zsub = a - b;5 e+ q" v/ B- ^/ z
7 A) b4 i  y5 J. m" {) t: S
mul = a * b;
$ V+ k$ }/ F* Y! [. Y8 O) M0 q# v) `3 @+ g+ Q/ N; C4 r
div = a / b;, Z1 q% ^: E- K6 Y( n

7 P. Y. X5 m: G, Send
0 p9 S3 W+ a( L) ^& X5 V& Q
3 G' m  J4 Y. g  p
# Q& i/ e0 N. ^% q! s
; ?7 k0 i7 O. ?PS:上面标红的部分与java中调用该operation的返回值有关系,在java中调用的 Object result[] = XXX.operation(4,a,b); 4表示有4个返回值,分别存放在result[0]到result[4]中。% }  }3 z, f" P. r3 n/ z' X% B  g
2 ^$ f0 I3 p- w4 z( k/ X" I- n

* t" g  ~' ~: q- [/ E% w  o1 a; D3 x: }+ Y& {
三、使用matlab编译生成jar! n1 a# i+ D' W0 E" o. P8 Q
在matlab命令窗口下输入 deploytool,就会弹出一个编译窗口,4 u  U- G/ C/ r

  k6 h# z' h1 [$ H" e* z然后点击,file,选择new-deployment project,
( S, a* P- o( @1 r  G: d* r+ A
3 ]7 p# W7 y8 P4 {& L+ C# w% p然后选择matlab builder jave。
! F( z3 a$ m: L1 K+ |, W; i, {- R; Z! F% Y: `; ]$ M$ P
name的地方填写工程名,
0 n! E$ S+ O! v- @: w5 B4 O1 j  k+ L) E6 U0 C
ocation填写该工程的存储位置。6 E& c5 W; s. v9 g

8 ]- h* Z. Z! T- S6 a点击ok。! S/ ]" }3 T$ `5 P" b$ E; V, U
+ u2 c4 u! ~, P/ b4 F$ ]
然后,把m文件添加到工程中,先new一个class,这个class的名字就是你将来在java中需要new的class的名字,也就是matlab中operation所在的class名字然后将你的m文件添加到这个class目录下,然后直接build即可。. q0 V+ e7 X- T$ M+ `
3 V5 M& N, P9 U5 F7 a  i
四、在java中使用matlab的函数
* l0 v4 d4 Z6 R1 d& g- w现在eclipse下面new一个新的java工程,然后将第三部build成功后产生的文件夹下面的distrib目录中的XXX.jar 以及你matlab安装目录下/toolbox/javabuilder/jar/javabuilder.jar加入你的java工程extend lib 中去。5 u' O, d" ^1 a+ L; i
然后你可以清晰的看到XXX.jar中包含的函数和类! i9 f- Z1 t* `, l3 M
* q: s% t$ R. A; J1 T) g, q% l6 u
[java] view plaincopy
& G9 U1 O7 X% h7 p/ w+ n4 ?import com.mathworks.toolbox.javabuilder.MWException;  
, s+ @0 v- W9 {3 Mimport com.mathworks.toolbox.javabuilder.MWNumericArray;  
3 w2 r2 Q, `- U! n* ximport XXX.XXXX;  6 d% E- K" e* |3 X
class Test {  
( c% N8 h7 \0 T6 n% X5 ^    public static void main(String[] args) {  1 g6 e0 f& d0 I4 O- r
        try {  & U9 A" l+ e& q+ F: H( b
            XXXX abc=new XXXX();  
+ q% O3 p4 |1 ~  N( c' H8 I                          5 ^3 ]' F' \+ M3 j
            Object[] result = null; /* Stores the result */  + p6 g& \. y% S
            int a=10, b=2;  
5 J5 ?9 @" t' {9 x( S; d, d: l            result=abc.operation(4, a, b );  / D6 F9 G! z/ ^# U
  
, r' t' U; ?& b4 O            System.out.println(result[0].toString());  4 R. f4 \( g7 d
            System.out.println(result[1].toString());  
! E9 P( d! ~) d% v$ T, w' p            System.out.println(result[2].toString());  
5 Y; o* u# |: V6 k            System.out.println();  
! Z* u6 C& \7 W# f% K# s0 d        } catch (MWException e1) {  # ?# U( a  I: X  O+ x0 G
            // TODO Auto-generated catch block   + ]) f# N8 Y4 P; O6 P$ ^
            e1.printStackTrace();  2 P/ P  G# g. w7 O# n! j. P
        } finally {  7 `* J% c+ d8 b2 v7 ]# C" t
            /* Free native resources */  ) s% Q: j: `2 M6 w! A/ g2 @
            System.gc();  
1 j; V) L. d! I2 {/ b: k, ^$ T        }  9 R  f" |1 J. Y# `8 c/ S! ?
    }  ; F3 A" y2 ]9 H! ]' A% R. ~5 t
import com.mathworks.toolbox.javabuilder.MWException;
5 Z# s- ?" Z% Jimport com.mathworks.toolbox.javabuilder.MWNumericArray;
/ W/ u8 Q+ }  b$ N) [import XXX.XXXX;7 L: R- ]' F' u
class Test {% K7 t$ w1 r. V! `+ a( Y* d
        public static void main(String[] args) {
; X2 B$ z2 D: |8 M                try {
+ @$ S! }6 R' H3 h& `0 B( |5 c" V. g                        XXXX abc=new XXXX();( r8 j% k) e! d& T# [
                                                & P, L% a: B. L- |& @: ^4 @2 ~" r7 P+ `
                        Object[] result = null; /* Stores the result */
3 P2 ~! t' b5 ~  T3 U7 _                        int a=10, b=2;; e8 N6 d$ p+ m2 ?: e' L+ W/ j
                        result=abc.operation(4, a, b );) m. H" [# Q7 G. _1 V
: e2 v$ e9 m- u1 o
                        System.out.println(result[0].toString());# d+ U1 w( F! _/ T1 j9 c& q
                        System.out.println(result[1].toString());
* t% V! I- w0 N" e! `( c                        System.out.println(result[2].toString());
0 N5 R; d$ J6 r6 N                        System.out.println();
. D0 X" F- D: h                } catch (MWException e1) {1 ?. T# [# Q4 g
                        // TODO Auto-generated catch block
# D: G6 f3 d. M7 a3 i5 R" i$ P                        e1.printStackTrace();8 G# }0 S  i) R" W) _# A8 n
                } finally {# A4 w5 u, _" z! F4 i
                        /* Free native resources */
* c4 \: x$ j/ Y: ?1 L                        System.gc();
/ ]& J6 M) R8 p7 a1 Z' m8 i6 G1 ]                }
8 f4 C8 O+ G% E$ n2 l- w        }
  X; g7 k4 j# X4 K+ [: D5 b+ h3 _3 n
如果result[0]返回的是一个数组,可以通过如下的方法解决, L6 E& G* A: x# f$ i9 y# }
MWNumericArray a = new MWNumericArray(Double.valueOf(result[0].toString()),MWClassID.DOUBLE);/ G' Y" }4 \% j
) \( l8 j* a4 D* D/ j& u' Y
MWNumericArray temp = (MWNumericArray)result[0]; 2 d/ H, W& \; z- K& w

7 R8 L& ^* ~- U4 f- Efloat [][] weights=(float[][])temp.toFloatArray();
4 n* N  C% {/ b" M$ v; n$ X5 [% W  [: w( B* E; @& t( N! g
  \- B! B3 P$ O. E4 W' b5 ^
五、可能碰到的问题
& u( p7 Y% h0 k0 s  u2 HException in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.13, required by MATLAB Builder JA, on java.library.path.6 K5 D  T% a6 \" @: _6 R* N
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.
/ n3 N3 F, f) q1 GThe MCR version that this component is trying to use is: 7.13.
$ x% b4 J7 d8 x& i0 c2 g  F' J2 X# f) f7 U
+ G. P. m8 H+ v# E" B
Failed to find the library mclmcrrt710.dll,required by MATLAB Builder JA, on java.library.path7 J8 d$ X0 n' j: L% I' Z

& j5 m+ e. z) |  t1 o( G+ q) L3 L7 p' V
4 ~7 [1 z& ]7 Y  k. I: M6 x: A. A  L
原因是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-8-23 19:22 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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