>> version -java
ans =
Java 1.7.0_11-b21 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode正常我是用的jdk1.8,但是不需要卸载,到Oracle仓库下载好对应jdk1.7.0u11版本安装,安装完将原有的Java环境变量配置稍微改动一下即可:
CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
# 有几个jdk就配几个变量,比如我的机器上有3个版本的jdk
JAVA_HOME_MATLAB:https://www.gofarlic.com\Program Files\Java\jdk1.7.0_11
JAVA_HOME7:https://www.gofarlic.com\Program Files\Java\jdk1.7.0_80
JAVA_HOME8:https://www.gofarlic.com\Program Files\Java\jdk1.8.0_101
JAVA_HOME:%JAVA_HOME_MATLAB%\上述根据不同学习需求可以直接更改最后一行的JAVA_HOME的变量的值即可,当前我是使用的是第一步中的jdk版本,并且命名为JAVA_HOME_MATLAB(见名知意吧)
做完上述工作后,打开系统DOS窗口,运行
java -version查看是否更改成功,我每次更改基本会有5到10秒的延迟才会生效,所以配置完可以等一会再看;
除此之外,matlab中默认载入启动时的jdk版本,所以务必重启matlab之后再次运行:
version -java才能配置成功!!一定要重启!系统jdk才能和matlab中的版本匹配!
【注意】今天莫名奇妙遇到一个问题,在安装完32位的JDK( 中文 官网下载),死活无法切换,就连其他版本的也无法切换了,原因在与环境变量优先级的问题,在安装完中文网上下载的JDK,它自动给我配置了一个PATH变量:C:\ProgramData\Oracle\Java\javapath,这是这货惹的麻烦,只要将这个变量删除即可,外文管网下载的JDK没有这个毛病, 解决 !
matlab中随意写个函数,下面是偷的其他人的函数:
function [ sum,sub,mul,div ] = operation( a, b)
sum = a + b;
sub = a - b;
mul = a * b;
div = a / b;
end写完保存,命令行运行
deploytool
选择第二个Library Compiler,进入界面后,选择Java Package并选择需要打包的函数.m文件,我这里是operation函数,其他的什么包名、类名
你们随便取(尽量能看得懂),这里不作具体说明,填好后点击右上角的Package选项,即可。如下:
然后就可以得到jar包,如下:
如果出错,你应该这样:请将第一步中环境配置工作反复进行,直到你第二步成功!!
导入两个jar包,一个就是上述的jar包,还有一个是MATLAB\R2014b\toolbox\javabuilder\jar路径下的javabuilder.jar包,java调用如下,由于本次函数中的数据类型比较简单,普通的int类型即可,复杂数据类型请自行百度两者类型的对应关系,测试代码:
import com.mathworks.toolbox.javabuilder.MWException;
import operation.Class1;
/**
* created by WeiguoLiu on 2017/12/27
*/
public class MatlabTest {
public static void main(String[] args) throws MWException {
int a = 9;
int b = 3;
Object[] result = null;
//都怪我,这个类名和方法名起的太搓了……
Class1 class1 = new Class1();
//虽然Matlab中只有2个输入量,但是查看生成的源码发现需要对结果对象的大小进行初始化
// 这里表示有4个返回值数量总共有4个
result = class1.operation(4,a,b);
for(Object o:result) {
System.out.println(o.toString());
}
}
}源码:
//4的由来,大小初始化
public Object[] operation(int var1, Object... var2) throws MWException {
Object[] var3 = new Object[var1];
this.fMCR.invoke(Arrays.asList(var3), MWMCR.getRhsCompat(var2, sOperationSignature), sOperationSignature);
return var3;
}注意:
BP神经网络案例:由于在Matlab中变量多以行向量或者列向量或者矩阵的形式输入,上述的只是简单int类型无法满足我的需要,在Java中通常可以定义一维或者二维数组的形式作为变量输入,但是在实际过程中,发现只能以行向量的形式作为输入,类似于这样:
Double[][] inputs2 = new Double[][]{{0.0, 20.6, 14.4, 42.8, 46.5, 19.6}};如果定义成列向量,会抛出输入参数过多的异常,如下:
Double[][] inputs = new Double[][]{
{0.0},
{20.6},
{14.4},
{42.8},
{46.5},
{19.6},
};最终在花费了巨额时间找到如下的解决方案,在定义好的数组上套一个封装即可解决,这一步一定不能掉!!:
//将此参数作为输入列向量传入即可
MWNumericArray array = new MWNumericArray(inputs);下面是Matlab中模式识别案例–螃蟹识别的Java调用的完整代码见:
https://github.com/Jacksonary/CodeRepository/tree/master/MatlabTest
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删