java中调⽤matlab软件进⾏计算,返回结果
之所以要写这个,是因为我最近需要⽤这个;⼀开始想使⽤java的⼈很多,遇到这个问题,应该在⽹上可以到满意的答案。 但通过搜索后,是有很多。 但仔细⼀看,都⼤同⼩异,⽽且有很多直接就是粘贴复制的嘛;结果没到。偶然的看到了有⽤matlabcontrol-4.1.0.jar 包来开发的⼀个⽂章。但也没有说个所以然,最后我针扎了⼀天,最后⾃⼰弄出来了。希望对⼤家有帮助。(查资料没有查到是在国内查的,没有。的话国外应该有,只是怪我查不⾏没有到吧)
⼀、⾸先说⼀下为什么要在java中调⽤matlab代码编程:
答: 当我们在编写java程序时,如果遇到⼤量的矩阵计算等⼀些数学计算很多的时候,如果我们使⽤java⾃⼰编写程序的话,代码量庞⼤,或者⾃⼰搞不出来,⽐如10个⽅程求解10个未知量时;⽽java⼜没有所有需要的库;这时我们就可以使⽤matlab这个⼯具了。这样⼤⼤的减少了代码量,提⾼了开发效率。
⼆、怎么⽤:
答:我看了⽹上有很多,⼤量的都是通过把matlab代码打包成jar的形式来使⽤。 本⽅法我也使⽤了,并折腾了⼀下午才打好⼀个包,调⽤的时候⼜出问题;为什么呢?因为他对软件版本⼀致性的要求很⾼,j
dk必须要与从matlab中查看到的java版本⼀致才⾏。 ⽽且运⾏时也是;我不知道运⾏时是不是严格要求⼀致,反正我是⼀致时,打包成功后去使⽤时报错⽽⽆法使⽤。所以我使⽤了matlabcontrol-4.1.0.jar 这个⼯具,我的资源中有上传这个⽂件。
(下载地址: 。
Demo: (含jar包))
[ 有积分的就给点积分吧,楼主也需要下载资源呀。没有积分下载的,可以后⾯留⾔,我发送邮箱。]
三、使⽤步骤:
1:确保电脑安装了matlab软件。我不知道对软包版本有没有要求,我(jdk1.8,matlab2016a)没有出问题。
2:新建⼀个java项⽬,导⼊这个jar包:
3:通过这样来调⽤:
我的demo.m(matlab代码是这样的):
function [f,x,favl,exitflag,output] = demo(p,Q,C,m,M,QQ,c)
f=C-p.*Q;
f=f';
intcon=1:6;
A=[C;-Q;ones(1,6);-ones(1,6);0,0,1,1,0,0,;0,0,-1,-1,0,0];
b=[c;-QQ;M;m;1;0];
lb=zeros(6,1);
ub=ones(6,1);
[x,favl,exitflag,output]=intlinprog(f,intcon,A,b,[],[],lb,ub);
end
切记:m⽂件⼀定要放在⼯作空间下,默认的⼯作空间是项⽬的空间,即把⽂件拷贝到项⽬的根⽬录下。
java代码:我先建了⼀个test测试单元:
public void xia() throws Exception {
MatlabProxyFactory factory = new MatlabProxyFactory();
MatlabProxy proxy = Proxy();
double p=0.2;
double[] Q={13795,537,2000,3000,4000,7049};
double[] C={65,-50,100,300,600,1080};
double m=2;
double M=5;
double QQ=10000;
double c=10000;
/
/下⾯第⼀个参数是⽅法民,第⼆个为返回的参数的个数,后⾯依次为输⼊的参数
Object[] result = urningFeval("demo",5,p,Q,C,m,M,QQ,c);
//返回的结果,是⼀个数组形式,所以⽤数组接收,下⾯为我取得第⼀个返回的参数f的值。
double[] r=(double[]) result[0];
System.out.print("f:");
for (int i = 0; i < r.length; i++) {
System.out.print(r[i]);
}
// 但返回的数组中,可能会返回对象,⽐如这的output,最后⼀个参数,就这样接收
Object[] r4=(Object[]) result[4];
String[] key=(String[]) r4[0];
for (int i = 0; i < key.length; i++) {
java怎么编写System.out.println(key[i]);
}
//反正就是去看结果的结构,根据对象类型⼀级⼀级的取值
}
问题⼜来了: 我的是web项⽬,⽤这个计算每次都会启动matlab,就会很慢。所以我先建了⼀个Listener来代理;只要启动后,后⾯就⽆需在次启动,Listenerd代码如下:
public void contextInitialized(ServletContextEvent sce) {
File file = new File("F:\\javawebWorkspace\\matlabDemo");//知道m⽂件的路基,可以任意
MatlabProxyFactoryOptions options = new MatlabProxyFactoryOptions.Builder()
.setProxyTimeout(300000L)
.setMatlabStartingDirectory(file)//设置MATLAB的开始⽬录。
.setHidden(false)
.build();
MatlabProxyFactory factory = new MatlabProxyFactory(options);
MatlabProxy proxy = null;
try {
proxy = Proxy();
}catch (MatlabConnectionException e) {
e.printStackTrace();
}
System.out.println("matlab连接成功");
}
调⽤的地⽅是这样的:
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { try {
MatlabProxy proxy=(MatlabProxy) ServletContext().getAttribute("proxy");
double p=0.2;
double[] Q={13795,537,2000,3000,4000,7049};
double[] C={65,-50,100,300,600,1080};
double m=2;
double M=5;
double QQ=10000;
double c=10000;
Object[] result = urningFeval("demo",5,p,Q,C,m,M,QQ,c);
double[] r=(double[]) result[0];
System.out.print("f:");
for (int i = 0; i < r.length; i++) {
System.out.print(r[i]);
}
double[] x=(double[]) result[1];
System.out.println();
System.out.print("x:");
for (int i = 0; i < x.length; i++) {
System.out.print(x[i]);
}
} catch (Exception e) {
// TODO: handle exception
}
}
这就是我的⽅法,有不对或者需改进的,希望⼤家给我指出,共同进步。谢谢。
下⾯是结果:
关于部署到服务器,远程桌⾯⽆法启动Matlab的解决办法,见此处:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论