Java和matlab混合編程
如果用Matlab和java混合編程開發Windows的應用程序則可以實現優勢互補,縮短開發時間,降低程序設計的復雜度。同時程序可以脫離Matlab環境獨立運行,在工程計算和教學實踐中都具有實際意義。
1.使用java調用Maltab函數的基本方法是:通過Java Builder實現Java調用Matlab。在Java環境中直接調用Matlab所生成的Jar包。
下面以在Java中產生任意維數的魔方矩陣,計算任意矩陣的特徵向量和特徵值,對兩組數據進
行擬合並繪制擬合曲線三個實例來說明通過Java
Builder實現Java調用Matlab的過程。傳統的純Java編程實現上述實例非常復雜,甚至很難完成。這一問題在Matlab中只需要調用幾個
函數即可完成。
1.1、將Matlab函數包裝成Java類
首先在Matlab中編寫三個M文件:
Eig.m
function [v,d]=Eig(input)
format long
[v,d]=eig(input);
End
Magic.m
function f =Magic( input )
f=magic(input);
end
Plot.m
function Plot(x,y )
p=polyfit(x,y,3);
t=min(x):max(x)/100:max(x);
s=polyval(p,t);
plot(x,y,'*',t,s);
title('數據擬合結果');
xlabel('x');
ylabel('y');
end
其次,在Matlab中新建一個Deployment
Project,名稱為MyProject.prj,類型為Java
package。在Project中新建三個Class,分別為GetEig,GetMagic,PolyFit。將
Eig.m,Magic.m,plot.m分別添加到上述Class中。之後點擊Builder the project,等待編譯成功即可。
1.2、在Java中調用Matlab函數
新建一個Java類JavaMatlab,並引入相關的包。
import com.mathworks.toolbox.javabuilder.*;//引入Matlab相關包
import MyProject.*;//引入建立的包及類
調用時Java與Matlab之間的參數傳遞需要通過MWNumericArray完成。具體的調用代碼如下:
package org.genius.ExpandJava;
import MyProject.*;
import com.mathworks.toolbox.javabuilder.*;
public class JavaMatlab {
public static void main(String[] args) {
MWNumericArray a = null; // 用於保存矩陣
MWNumericArray ax = null; // 用於保存矩陣
MWNumericArray ay = null; // 用於保存矩陣
Object[] result = null; // 用於保存計算結果
GetEig getEig = null;
GetMagic getMagic=null;
PolyFit polyFit=null;
int r = 4; // 魔方矩陣維數
int array[][]={{50,-20,0},{-20,80,60},{0,60,-70}};
double x[]={0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1};
double y[]={-0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.3,11.2};
try {
//產生魔方矩陣並列印
a = new MWNumericArray(r, MWClassID.DOUBLE);
getMagic = new GetMagic();
result = getMagic.Magic(1,a);
System.out.println("產生的四維魔方矩陣:");
System.out.println(result[0]);
MWArray.disposeArray(result);
//計算所給矩陣的特徵向量和特徵值並列印結果
a = new MWNumericArray(array, MWClassID.DOUBLE);
getEig = new GetEig();
result = getEig.Eig(2, a);
System.out.println("原始矩陣:");
System.out.println(a.toString());
System.out.println("得到的特徵向量:");
System.out.println(result[0]);
System.out.println("得到的特徵值:");
System.out.println(result[1]);
MWArray.disposeArray(result);
ax = new MWNumericArray(x, MWClassID.DOUBLE);
ay = new MWNumericArray(y, MWClassID.DOUBLE);
polyFit = new PolyFit();
result=polyFit.Plot(ax,ay);
polyFit.waitForFigures();
} catch (Exception e) {
System.out.println("Exception: " + e.toString());
}
finally {
// 釋放本地資源
MWArray.disposeArray(a);
MWArray.disposeArray(ax);
MWArray.disposeArray(ay);
MWArray.disposeArray(result);
getEig.dispose();
getMagic.dispose();
polyFit.dispose();
}
}
}
『貳』 java調用matlab的問題 含有多個輸入參數
保存成函數之後運行,需要給函數提供輸入參數
如果你的工作空間中有一個變數vector,你需要對其標准化
在編寫好cwstd.m文件之後
在命令行輸入std=cwstd(vector);
就可以看到生成了std變數,是vector經過標准化之後的結果
如果你有另外一個變數a,想將其標准化,結果存在b中
那麼在命令行輸入b=cwstd(a);
寫成函數文件之後,輸入輸出參數都只是名字
供函數內部調用和返回,已經和你原本空工作空間中的變數沒有關系了
因此,你可以在調用函數的時候給它輸入不同名字的參數,輸出不同名字的參數
『叄』 JAVA如何調用MATLAB
你需要安裝matlab里的matlab builder JA,
默認應該是有安裝的
其實看一下matlab的幫助就好了,十分詳細,還有例子
『肆』 如何在Java中調用Matlab
一、matlab版本必須支持java
在command 模式下面運行deploytool,如果支持該命令即可使用
二、matlab中function的書寫
%定義一個函數operation(a,b),求a與b的加減乘除運算,並返回結果
%函數定義function 輸出變數列表[s,m,...] 函數名(輸入變數列表)sum,sub,mul,div中
function [sum,sub,mul,div] = operation(a,b);
sum = a + b;
sub = a - b;
mul = a * b;
div = a / b;
end
PS:上面function後中括弧部分與java中調用該operation的返回值有關系,在java中調用的 Object result[] = XXX.operation(4,a,b); 4表示有4個返回值,分別存放在result[0]到result[4]中。
三、使用matlab編譯生成jar
在matlab命令窗口下輸入 deploytool,就會彈出一個編譯窗口,
然後點擊,file,選擇new-deployment project,
然後選擇matlab builder jave。
name的地方填寫工程名,
ocation填寫該工程的存儲位置。
點擊ok。
然後,把m文件添加到工程中,先new一個class,這個class的名字就是你將來在java中需要new的class的名字,也就是matlab中operation所在的class名字然後將你的m文件添加到這個class目錄下,然後直接build即可。
四、在java中使用matlab的函數
現在eclipse下面new一個新的java工程,然後將第三部build成功後產生的文件夾下面的distrib目錄中的XXX.jar 以及你matlab安裝目錄下/toolbox/javabuilder/jar/javabuilder.jar加入你的java工程extend lib 中去。
然後你可以清晰的看到XXX.jar中包含的函數和類
五、可能碰到的問題
Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.13, 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.13.
Failed to find the library mclmcrrt710.dll,required by MATLAB Builder JA, on java.library.path
原因是2009a要對應安裝mclmcrrt7.10。在MATLAB安裝目錄下查找:\toolbox\compiler\deploy\win32,找到MCRInstaller.exe 安裝,重啟Eclipse即可。
資料來源:http://blog.csdn.net/com_stu_zhang/article/details/7605391
『伍』 Java怎麼調用含有多個輸入參數的matlab函數呢
function用來定義函數,一般一個函數放在一個.m文件里。舉個簡單的例子建立一個myfunction.m,然後在文件中寫。
function y=myfunction(a,b)
其中a,b是輸入函數的參數,y是函數返回的值。當需要返回多個值時,可以將y看作一個數組,或者直接將函數的開頭寫成如function [x,y]=myfunction(x,y)的形式。
然後就是定義函數的內容,通俗的說就是怎樣由輸入參數a,b得到返回值y。比如最簡單的y=a+b。
總結一下,將下面的代碼
function y=myfunction(a,b)
y=a+b;
保存為一個m文件myfunction.m,調用方式如下。
num=myfunction(3,4);
這樣就可以由函數中的y=a+b得到num的值是3+4=7。
『陸』 java調用matlab有哪些方法
在Java中調用Matlab的方法時,有三種方式。大致都有2個參數,第一個參數是定義輸出結果,第二個參數為輸入參數。
方式一:functionName(int arg0, Object... agr1): Object[]
方式二:functionName(List arg0, List agr1): void
方式三:functionName(Object[] arg0, Object[] agr1): void
『柒』 如何在java中調用matlab代碼
前段時間摸索了java調用matlab東西,不說學的有多深,也算有結果了,達到目的了。也即用java程序可以調用matlab中函數了。
按順序說吧,最開始肯定是下個matlab看看。下哪一個呢。開始下一個7.0覺得很新了。後來才覺得不是,現在都有7.8了。同時網上還流傳著另外一種版本號信息,即2006版、 2006a版、2008b版,後來從網上找資料才知道,原來,matlab是一年兩版的,叫a版和b 版。比如MATLAB 7.2 (Release 2006a),我下的是m7.8即2009a版。網上有對應關系,有興趣可以找一下。
先說明一下,我用java調用matlab用的是matlab人提供的,MABLAB BUILDER JA工具,還要告訴你,這工具2006b版以前是沒有的,我想以前java可能通過JNI通過c來調用matlab的。所以你下載時要注意版本了。還有一點要說明下,如果你用的是AMD的處理器,不是intel的處理器,安裝matlab後,可能不能運行,具體表現是,一打開就關閉了。我公司機器用就是AMD的處理器,解決辦法其實也很簡單,就是給你的機器新建立一個系統變數,變數名是BLAS_VERSION,變數值是D://MATLAB7//bin//win32//atlas_Athlon.dll(你的matlab安裝地址)。
然後,就是我們學著用MABLAB BUILDER JA了,開始不知道看matlab幫助,只是從網上看別人寫的東西,關於這樣的文章基本上出自一個娘胎,我不明白的地方,都一樣的沒有。後來看到了matlab幫助文檔了,確實興奮了一把,那才是最正宗的。下面我就試著按照它的說明一步一步說一下。
先來,介紹一下MATLAB® Builder™ JA吧,它是 MATLAB® Compiler™的擴展產品,用它你可以把你的m-code文件包裝起來,並打包到一個多個class文件中,這樣的你的java程序就能用matlab了,其實是這樣的,m-codeiv當然就是你想調用的matlab程序了。
要說明一點,如果你只是在安裝matlab的機器上,用java調用運行由MATLAB® Builder™ JA生成的jar包,當然可以。
如果你要在沒有安裝matlab的機器上用java調用這些jar包,怎麼辦?也是可以的,不過,不過你要先在機器上安裝matlab提供的MATLAB Compiler Runtime (MCR),它的安裝文件在C:/Program Files/MATLAB/R2009a/toolbox/compiler/deploy/win32下(你的安裝目錄下)文件名MCRInstaller.exe。
准備工作:
java環境,JAVA_HOME設置正確。還有一點你jdk版本要是1.6以上的,1.5可能有錯。
關鍵部分來了,在這部分你可以,通過一個例子,看到一個M-code function轉變成為java可調用組件。
這個例子的名字叫,magic square,這個例子讓你學會如何,創建一個叫magicsquare 的java組件,它主要包括一個 magic class,和一個jar文件,還有其它上些發布組件用到的文件。magic .class是最關鍵的,就是它包裝了, MATLAB 的函數 makesqr, makesqr函數是計算魔方數組用的,後面我們就是java程序,調用這個函數。
MATLAB Builder JA,可以通過在matlab命令,deploytool 調出,在這之間,為了驗證matlab已能得到你的java環境了,你可以用,getenv JAVA_HOME來驗證一下,能返回你的JAVA_HOME就是正確的了。
這個例子的,m代碼和java代碼,matlab都幫我們寫好了。你現在需要做的就是把它的代碼拷貝你的工作空間中,它是例子在
matlabroot /toolbox/javabuilder/Examples/MagicSquareExample .
matlabroot就是matlab的安裝目錄。
『捌』 java調用matlab函數的參數問題
表示你輸出參數的個數,你這個是畫圖的函數,所以輸出參數為0,舉個例子 function [sum]=add(a,b) sum=a+b; end
在java程序里調用的時候就得使用add(1,a,b),因為有一個輸出參數sum
『玖』 java和matlab之間數據類型的轉換規則
其實java和matlab類型的轉換並不困難,java與matlab可以混合編程,所以你可以在matlab端寫一個M文件用於將matlab的矩陣換為數組(這個很簡單三),然後將數組發給java端~同理在matlab端還寫一個m文件用於將從java端發來的數組轉換為矩陣,不需要強轉,你只需要建一個新的矩陣,然後將數組的內容填進去就ok啦~
希望能夠幫助到你!
『拾』 在java中調用Matlab的程序,出現了如下的錯誤,求指導!
在java里調用matlab中的函數(如本例中的h1),需要傳遞的參數比函數本身的參數要多一個。
所以正確的調用形式應該為h1(1,a,b),第一參數是該函數的輸出的個數,後面兩個是h1所需的參數