欢迎投稿

今日深度:

如何实现在Oracle中应用存储过程调用MatLab函数(

如何实现在Oracle中应用存储过程调用MatLab函数(1)


设计思路:首先在eclipse中使用java调用Matlab函数,再在Oracle存储过程中将java类映射其中。(本文最终还是选择了matlab2012b ,eclipse3.5,jdk1.6. 45,oracle12c(向下兼容jdk1.6,低版本不行))提供下载地址:http://pan.baidu.com/s/1dEj86op
(1)首先讲解如何利用eclipse调用matlab函数,以及个人遇到的一些问题和问题的解决思路。
准备工作:安装jdk,jdk的位数要与matlab的jdk的位数(32bit 和64bit 有区别的)相同,否则会出现兼容问题。jdk是高版本兼容低版本的。
假设你已经安装了jdk 和 eclipse 和 matlab了。
首先,要确定你电脑上装好了MATLAB并且配置好了Java的运行环境,注意,MATLAB的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder)。
本人使用的 matlab2012b 版本 eclipse为 :win32.x86_64_1.1.200.v20150204-1316.
第一步:打开打开MATLAB(笔者用的是MATLAB 2012b,版本的一些差异我会在后面注明),在Command Window框中输入deploytool,会跳出如下界面:
\
在Name中输入名字,在Location中选择路径,最后在Type中选择Java Package:

可能在有些版本中选择Type时显示的是Matlab Builder for Java,并且在Deployment Tool面板中还有Generate Verbose Output选项框,勾选上它,针对不同的版本时可能有一些出入,大家多留心一些,自己多尝试尝试。
举一个加法函数的例子:在matlab中写一个函数:
function sum = add(x,y)
sum=x+y;
end
保存成 add.m
然后在MATLAB中找到Java Package窗口,添加class文件,命名这个class文件的时候要注意了,因为这个文件就是以后导入到Java中要作为一个对象的名字,也就是说它就是放在new后面作为构造函数的类名。这里命名为matlabAdd:这里写图片描述
然后添加类和方法:
这里写图片描述

注意,此处仍然是matlabAdd.prj 下 add files 文件,此处截图有误,读者了解即可。
这里写图片描述
进行打包,打成jar包:
这里写图片描述
调用打包好的matlab函数
在MATLAB安装的目录中找到”…\toolbox\javabuilder\jar\javabuilder.jar”的文件,并在你刚才打包的文件夹中找到对应的包,本例中是matlabAdd.jar,然后将这两个jar包导入到你的Java项目当中。这里写图片描述

其实真正使用64位时候,要在 win64中拷取javabuilder.jar文件,如图:
这里写图片描述

这里写图片描述

其实,实在matlabAdd 项目的 src中拷取的 jar包:如图:

这里写图片描述

找到这些jar包以后,在eclipse里新建一个java项目,记住,jdk版本要匹配,比如mattlab中的jdk为64bit的那么eclipse使用的也必须为64bit的,否则会出现加绒问题。
这里写图片描述
将jar包导入到项目以后,就可以进行编码,对matlab的加法函数jar包进行调用了:
这里写图片描述

代码如下:
package matLab;

import com.mathworks.toolbox.javabuilder.*;
import matlabAdd.*;

class matAdd
{
public static void main(String[] args)
{
MWNumericArray a = null;
MWNumericArray b = null;
Object[] result = null;
matlabAdd 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 matlabAdd();

         result = myAdd.add(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();
     }
 }

}

当输入 1 3 时候,中间用空格隔开,结果:
运行结果为:
The sum of 1 and 3 is: 4

本次配置主要出现的额问题就是 jdk兼容问题,其他问题没出现。
Exception in thread “main” java.lang.UnsatisfiedLinkError: Failed to find the library mclmcrrt7_17.dll, required by MATLAB Builder JA, on java.library.path.
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.
The MCR version that this component is trying to use is: 7.17.
at com.mathworks.toolbox.javabuilder.internal.MCRConfigurationProxyLibraryDir.get(MCRConfiguration.java:167)atcom.mathworks.toolbox.javabuilder.internal.MCRConfigurationProxyLibraryDir.(MCRConfiguration.java:173)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getProxyLibraryDir(MCRConfiguration.java:178)
at com.mathworks.toolbox.javabuilder.internal.MCRConfigurationMCRRoot.get(MCRConfiguration.java:77)atcom.mathworks.toolbox.javabuilder.internal.MCRConfigurationMCRRoot.(MCRConfiguration.java:87)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:92)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.(MCRConfiguration.java:66)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:71)
at com.mathworks.toolbox.javabuilder.internal.MWMCR.(MWMCR.java:1462)
at mysum.MysumMCRFactory.newInstance(MysumMCRFactory.java:48)
at mysum.MysumMCRFactory.newInstance(MysumMCRFactory.java:59)
at mysum.mysum.(mysum.java:62)
at sumceshi.main(sumceshi.java:9)

是因为你的matlab所运行的java虚拟机和你程序的java虚拟机,一个是64位,一个是32位,或者版本不同导致的。matlab输入version -java看一下java版本,然后如果是64位的就去下一个安装。我是用eclipse给你提供个eclipse 的修改方法,去你eclipse点window=>preferences=>installed JREs=>add,将新安装的加进去,然后去你的项目右键=>properties=>java build path=>libraries把之前的jre删了,然后点add librariy=>JRE system library=>alternate JRE,选你刚装的jre,finishing,ok,

www.htsjk.Com true http://www.htsjk.com/oracle/23994.html NewsArticle 如何实现在Oracle中应用存储过程调用MatLab函数(1) 设计思路:首先在eclipse中使用java调用Matlab函数,再在Oracle存储过程中将java类映射其中。(本文最终还是选择了matlab2012b ,eclipse3.5,...
评论暂时关闭