您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Java怎么調(diào)用Matlab程序”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“Java怎么調(diào)用Matlab程序”這篇文章吧。
背景
Matlab可以輕易處理非常復雜的數(shù)學計算,Java具有多變的應(yīng)用場景,如Web開發(fā)。本文講述如何將兩者優(yōu)勢結(jié)合起來,基本思路是將Matlab核心程序打包成Jar,供普通的Java程序調(diào)用。
具體步驟
檢查MATLAB內(nèi)置的Java版本
檢查系統(tǒng)的Java版本
為了測試各種數(shù)據(jù)類型(如Matlab的矩陣數(shù)據(jù)類型)的使用,本文采用稍稍復雜的Matlab測試程序:基于測距的網(wǎng)絡(luò)定位。其包含多個M文件,其中主函數(shù)代碼如下。輸入?yún)?shù)7個:gCov是矩陣,其他為標量。輸出參數(shù)2個,都是矩陣。
function [ nodeLoc, pMds ] = main_localization( N, dim, space, nGps, gCov, sigma, numMiss ) nodeLoc = diag(ones(dim,1)*space)*(rand(dim,N)-0.5); dltSec = zeros(N,1); achrIdx = 1:nGps; covMats = zeros(dim,dim,nGps); for n = 1:nGps covMats(:,:,n) = gCov; end [CT,CR] = round_robin(nodeLoc,dltSec,sigma); [A,~,y] = gen_Ay(CT,CR,ones(N)); connMat = gen_connMat(N,numMiss); dltEst = est_dlt_ls(A,y,connMat); distVec = y-A*dltEst; distMat = diag_vec2mat(distVec); edm = distMat.^2; pGps = mvnrnd(nodeLoc(:,achrIdx)',gCov)'; pMds = classic_mds(edm, dim); pMds = orthogonal_procrustes(pMds, pGps, achrIdx); end
其他多個M文件列表如下圖所示:
(1) 在Matlab命令行窗口輸入deploytool指令,喚起打包部署工具
(2) 配置打包類型、包名、類名;選擇待打包的M的文件
(3) 等待打包完成,應(yīng)有3個對勾
(4) 打包生成的工程目錄結(jié)構(gòu)如下
(1) Eclipse新建Java項目(不贅述)
(2) 添加兩個Jar包到Java項目中
Matlab安裝目錄下的Jar包:...\MATLAB\R2017a\toolbox\javabuilder\jar\javabuilder.jar前面M文件生成的Jar包:...\localization_matlab\for_redistribution_files_only\localization_matlab.jar
(3) 寫Java程序調(diào)用Matlab生成的Jar包,源碼如下:
package com.csrl.localization; import com.mathworks.toolbox.javabuilder.MWClassID; import com.mathworks.toolbox.javabuilder.MWException; import com.mathworks.toolbox.javabuilder.MWNumericArray; import localization_matlab.MdsLocalization; public class TestLocalization { public static void main(String[] args) { try { MdsLocalization matrixCompletion = new MdsLocalization(); double N = 10; double dim = 2; double space = 500; double sigma = 2; double nGps = 5; double numMiss = 0; double[][] gCovArr = {{1,0},{0,1}}; MWNumericArray gCov = new MWNumericArray(gCovArr,MWClassID.DOUBLE); // 將二維數(shù)組轉(zhuǎn)化為矩陣 // 第一個參數(shù)“2”代表原Matlab函數(shù)輸出參數(shù)的個數(shù),后面的都是原Mat了吧函數(shù)輸入?yún)?shù);輸出參數(shù)用Object數(shù)組保存 Object[] result = matrixCompletion.main_localization(2, N, dim, space, nGps, gCov, sigma, numMiss); MWNumericArray data = (MWNumericArray) result[0]; // 第一個輸出參數(shù) double[][] nodeLoc = (double[][]) data.toDoubleArray(); // 將矩陣轉(zhuǎn)化為二維數(shù)組 data = (MWNumericArray) result[1]; // 第二個輸出參數(shù) double[][] pMds = (double[][]) data.toDoubleArray(); // 將矩陣轉(zhuǎn)化為二維數(shù)組 System.out.println(result[0]); // 同Matlab輸出格式,輸出矩陣 System.out.println(result[1]); System.out.println(nodeLoc[0][0]); // 通過二維數(shù)組索引輸出矩陣中某個元素 System.out.println(pMds[0][0]); } catch (MWException e) { e.printStackTrace(); } } }
筆記是記錄通過java如何調(diào)用matlab函數(shù):
在package的過程中可能會出現(xiàn)mcc錯誤的情況
import com.mathworks.toolbox.javabuilder.MWException; import computef.ComputeF; public class matlab2javaTest { public static void main(String args[]) throws MWException { System.out.println( System.getProperty("java.library.path")); ComputeF cl = new ComputeF(); cl.computef(0); } }
第一次運行時,會報如下錯誤
Exception in thread “main” java.lang.UnsatisfiedLinkError: Failed to find the library mclmcrrt7_14.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.14.
錯誤原因可能是:path中沒有matlab的路徑,即找不到mclmcrrt7_14.dll這個文件,添加matlab路徑到path中就可以了
m文件內(nèi)容:
function [f,c]=computef(key)
調(diào)用computerf函數(shù)時
Object[] result = null; result = cl.computef(2,0);//第一個參數(shù)是返回結(jié)果的個數(shù),第二個參數(shù)是實際參數(shù)
以上是“Java怎么調(diào)用Matlab程序”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。