使用Java程序调用MatLab
Java代码实现的计算难免会显得不够高效。而利用MATLAB写好相应的计算函数,然后打包成jar包供Java调用,在某些情况下会更加方便。或者有些时候会涉及到使用Java调用MatLab展现一些二维三维图。因此用到Java调用MatLab。
一:注意事项
1: MatLab的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder)。
2: 运行机器上必须装有JRE 并且版本要和MatLab自带的jre 大版本保持一致(位数也要保持一致)(大版本一致既可,比如同是1.6,或者1.7既可)
查看MatLab 自带JRE版本位数方法:在MatLab中Command Windows中输入 【version -java】 命令查看。如图所示:
这里是 1.6.0_17-b04 版本的JRE 并且为64位的。(注意:这里之所以是64位的,取决于您当初下载的MatLab安装包的位数。
3:验证系统jdk jre,系统首先装有Java环境(不在叙述)。 验证jdk,jre版本位数。打开cmd 输入命令 【java -version】
和 【javac -version】分别验证编译和运行版本。也许有读者会想,两个命令查看的结果肯定版本都一样,但是有些情况java和javac
的版本还真不一样,比如安装了多个版本的jdk或者不同位数的jdk,如果是以安装的方式安装,那么java版本和位数是以最后一次安装
保持一致,因为安装时,会把java.exe拷贝到系统目录一份(例如:win8中的c:/windows/system32)。虽然配置了java环境变量,但是
如果java环境变量配置在了path变量值得最后方,由于系统目录配置在了最前方,以前方为准。因此会出现配置无效。照成了以上所说的
情况,这种情况解决方法有两种(1:删除系统目录下的相关java文件,2:把java环境变量配置到Path的最前面)。
无法正常显示。如果读者发生这种情况,可以试着用这种方式解决。
如 果你用的是AMD的处理器,不是intel的处理器,安装matlab后,可能不能运行,具体表现是,一打开就关闭了。解决办法其实也很简单,就是给你的 机器新建立一个系统变量,变量名是BLAS_VERSION,变量值是D://MATLAB7//bin//win32 //atlas_Athlon.dll(你的matlab安装地址)。
6:如果你要在没有安装matlab的机器上用java调用这些jar包,怎么办?也是可以的,不过,不过你要先在机器上安装matlab提供的MATLAB Compiler Runtime (MCR) ,它的安装文件在D:\program files\study\MATLAB\R2007b\toolbox\compiler\deploy\win32下(你的安装目录下)文件名MCRInstaller.exe。
二:调用基本步骤
1:打开MatLab,HOME -》 新建脚本 打开Editor窗口。脚本内容如下:
%画图 自定义函数drawplot 参数 x y
function drawplot(x, y)
plot(x, y); %%使用matlab函数plot()作图
grid on %网格显示
xlabel('X轴值')
ylabel('Y轴值')
title('Java调用MatLab作图例子')
2:在计算机某个目录建个存放MatLab脚本及其后期编译出的java文件。例如:桌面\mjTest。保存脚本到此文件夹下。保存后,
在mjTest文件夹下多了一个drawplot.m文件。
3:在MatLab下Command Window下输入 【deploytool】 命令,打开部署工具Deployment Tool。新建一个工程demo.prj,设置路径为mjTest
既可,类型选择Java Package 点击确定。这时MatLab右侧自动打开了java部署窗口。
4:在Build选项卡下点击 Add classes 添加一个名称为plotter的Class(java类,在后边java代码中会调用到)。
5:在plotter底下点击Add files,添加刚才mjTest下的drawplot.m文件。点击上图右上方位置的编译按钮(两个向下箭头的那个按钮)。
编译时间稍微有些长,耐心等待即可。
6:编译完成后,我们会在mjTest目录下看到了demo文件夹生成了。进入demo/distrib目录。如发现demo.jar。则可以进行下一步操作了。
7:打开Myeclipse或者eclipse等IDE工具
新建JavaProject mjTest(项目名称随意),并且引用以下两个jar包
E:\Program Files\MATLAB\R2013a\toolbox\javabuilder\jar\javabuilder.jar(MatLab安装目录下)如果是64位,选择E:\Program Files\MATLAB\R2013a\toolbox\javabuilder\jar\win64\javabuilder.jar
以及刚刚生成的demo\distrib\demo.jar
新建ConnectMatLabTest.java:
package com.xiami.test; import com.mathworks.toolbox.javabuilder.MWArray;
import com.mathworks.toolbox.javabuilder.MWClassID;
import com.mathworks.toolbox.javabuilder.MWComplexity;
import com.mathworks.toolbox.javabuilder.MWNumericArray; import demo.plotter; public class ConnectMatLabTest { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MWNumericArray x = null; // 存放x值的数组
MWNumericArray y = null; // 存放y值的数组
plotter thePlot = null; // plotter类的实例(在MatLab编译时,新建的类)
int n = 20; // 作图点数 try {
// 分配x、y的值
int[] dims = { 1, n };
x = MWNumericArray.newInstance(dims, MWClassID.DOUBLE,
MWComplexity.REAL);
y = MWNumericArray.newInstance(dims, MWClassID.DOUBLE,
MWComplexity.REAL); // 定义 y = x^2
for (int i = 1; i <= n; i++) {
x.set(i, i);
y.set(i, i * i);
} // 初始化plotter的对象
thePlot = new plotter(); // 作图
thePlot.drawplot(x, y);
thePlot.waitForFigures();
} catch (Exception e) {
System.out.println("Exception: " + e.toString());
} finally {
// 释放本地资源
MWArray.disposeArray(x);
MWArray.disposeArray(y);
if (thePlot != null)
thePlot.dispose();
}
} }
运行此类既可看到效果(Run -》 javaapplication),如下图所示:
三:调用matlab函数并返回计算结果
参照http://blog.sina.com.cn/s/blog_a9ca82260101e4lj.html
如下:
考虑到计算的各种情况,有些用Java代码实现的计算难免会显得不够高效。而利用MATLAB写好相应的计算函数,然后打包成jar包供Java调用,在某些情况下会更加方便。现在就来说一下如何实现这一过程:
1.确定配置好了相应的环境
首先,要确定你电脑上装好了MATLAB并且配置好了Java的运行环境,注意,MATLAB的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder)。
2.打包步骤
a)打开MATLAB(笔者用的是MATLAB 2012b,版本的一些差异我会在后面注明),在Command Window框中输入deploytool,会跳出如下界面:
可能在有些版本中选择Type时显示的是Matlab Builder for Java,并且在Deployment Tool面板中还有Generate Verbose Output选项框,勾选上它,针对不同的版本时可能有一些出入,大家多留心一些,自己多尝试尝试。
c)在MATALAB的Editor中新建一个m文件,这里编辑一个简单的加法函数add并保存:
d)在MATLAB中找到Java Package窗口,添加class文件,命名这个class文件的时候要注意了,因为这个文件就是以后导入到Java中要作为一个对象的名字,也就是说它就是放在new后面作为构造函数的类名。这里命名为matlabAdd:
e)然后点类名下的Add files,将刚才编辑好的m文件add.m加到matlabAdd当中。
f)接着就可以打包了,还是在Java Package窗口找到,点击就可以打包了。等打包好,就可以调用了。
3.调用打包好的matlab函数
a)在MATLAB安装的目录中找到"...\toolbox\javabuilder\jar\javabuilder.jar"的文件,并在你刚才打包的文件夹中找到对应的包,本例中是firstOne.jar,然后将这两个jar包导入到你的Java项目当中。
b)新建JAVA类文件MJBuilderTest.java,示例代码如下:
import com.mathworks.toolbox.javabuilder.*;
import myadd.*; class MJBuilderTest
{
public static void main(String[] args)
{
MWNumericArray a = null;
MWNumericArray b = null;
Object[] result = null;
Myadd myAdd = null;
try
{ if (args.length != 2)
{
System.out.println("Error: must input 2 numbers!");
return;
} a = new MWNumericArray(Double.valueOf(args[0]),MWClassID.DOUBLE);
b = new MWNumericArray(Double.valueOf(args[1]),MWClassID.DOUBLE); myAdd = new Myadd(); result = myAdd.myadd(1, a, b);
System.out.print("/nThe sum of " + a.toString() + " and " + b.toString() + " is: ");
System.out.println(result[0]);
}
catch (Exception e)
{
System.out.println("Exception: " + e.toString());
} finally
{ MWArray.disposeArray(a);
MWArray.disposeArray(b);
MWArray.disposeArray(result);
if (myAdd != null)
myAdd.dispose();
}
}
}
c)在Eclipse中设置好输入参数输入窗口:Run as- Run configations-Arguments 选择 要输入的数据类型,这里选择的是“string_prompt”,点击应用。
d)编译执行MJBuilderTest.java,输入参数(2个参数用空格隔开),例如:1 2 ,如果配置正确,结果会显示
“The sum of 1 and 2 is: 3”
使用Java程序调用MatLab的更多相关文章
- java程序调用存储过程
java程序调用存储过程 PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程.下面我们介绍下使用java调用Oracle的存储过程. ...
- java程序调用存储过程和存储函数
java程序调用存储过程 jdbcUtil.java文件 package cn.itcast.oracle.utils; import java.sql.Connection; import java ...
- 通过java程序调用ant build.xml配置文件中指定的target
一.概述 通过ant实现项目的自动化部署,jar包生成,替换,tomcat关停.启动,查看项目日志: 通过java程序调用已编辑好的ant脚本build.xml配置文件中指定的target: 文中文件 ...
- 【原】Java程序调用远程Shell脚本
此程序的目的是执行远程机器上的Shell脚本. [环境参数]远程机器IP:192.168.234.123用户名:root密码:rootShell脚本的路径:/home/IFileGenTool/Bak ...
- Java程序调用带参数的shell脚本返回值
Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: - \)$ Shell本身的PID(ProcessI ...
- Java中调用MatLab返回值
当在Java中使用MatLab函数时,由于语言语法的不同,Matlab返回多个数据时,想在Java中获取到并进行使用.查阅了网上资料,翻箱倒柜加上自己实战,得出方法如下: 如MatLab函数返回的是N ...
- 转载:java程序调用内存的变化过程
前文知道了java程序运行时在内存中的大概分布,但是对于具体程序是如何运行的,看到一篇文章,直接转载过来. (一)不含静态变量的java程序运行时内存变化过程分析 代码: package oop; / ...
- java程序调用kettle
(1).将相应的kettle的jar包导入的java项目,主要的jar包有一下几个. (2).java程序. package cn.com.taiji.oosweb.test.web; import ...
- (转)java程序调用内存变化过程分析(详细)
原博地址: https://blog.csdn.net/Myuhua/article/details/81385609 (一)不含静态变量的java程序运行时内存变化过程分析 代码: package ...
随机推荐
- HibernateTools实现pojo类 数据库schma mapping映射的相互转换
核心 利用HibernateTools,从POJO类,Mapping映射文件,数据库表有其中的一项,就能生成其他两项. 概述 在使用Hibernate开发系统持久层时,按照一般开发流程 1.分析业务 ...
- cocos2d-x 开启深度测试验 实现 遮挡
CCDirector::sharedDirector()->setDepthTest(true); spr->setVertexZ(xxx);
- 浅谈Websocket、Ajax轮询和长连接(long pull)
最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket Websocket是HTML5中提出的新的协议,注意,这里是协议,可以 ...
- React学习、安装及QuickStart
首先看的是这个页面 http://www.cocoachina.com/webapp/20150721/12692.html 这里有个内容差不多的版本(精华版):http://www.cnblogs. ...
- poj 1934(LCS)
转自:http://www.cppblog.com/varg-vikernes/archive/2010/09/27/127866.html 1)首先按照常规的方法求出最长公共子序列的长度也就是用O( ...
- BZOJ 1202 狡猾的商人
前缀和+带权并查集. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...
- [转]深入理解Flash Player重绘
这个是tencent flash team的一篇文章,但团队的博客已经关闭了,所以就在这里备份下吧~ 后来有人把这篇文章又发布到9ria上了,引发了一些讨论,其中有两位大神发言了,内容在原文下方. 9 ...
- 使用 Linux 终端 SSH 登录 VPS
Windows 中远程 SSH 登录 VPS 进行管理的利器是 PuTTY,但是 Linux 中就没必要用它了.Linux.Unix(包括 Mac iOS)都必然有内置的命令行终端,内建了 OpenS ...
- Apache Conf/Vost/xx.conf 文件配置
#监听8086端口Listen 8086 NameVirtualHost *:8086#保持绝对一致 <VirtualHost *:> ServerName localhost Serve ...
- sysbench 安装
sysbench源代码可以在https://launchpad.net/sysbench找到.也可以从本文件附件中下载. 先安装好mysql,记录下安装目录.默认为 /usr/local/mysql ...