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”