Java如何調(diào)用Matlab程序
Java如何調(diào)用Matlab程序
背景
Matlab可以輕易處理非常復(fù)雜的數(shù)學(xué)計(jì)算,Java具有多變的應(yīng)用場(chǎng)景,如Web開(kāi)發(fā)。本文講述如何將兩者優(yōu)勢(shì)結(jié)合起來(lái),基本思路是將Matlab核心程序打包成Jar,供普通的Java程序調(diào)用。
具體步驟
1. 檢查Matlab內(nèi)置的Java版本和系統(tǒng)安裝的Java版本是否一致?
檢查MATLAB內(nèi)置的Java版本

檢查系統(tǒng)的Java版本

2. 準(zhǔn)備一份要調(diào)用的Matlab代碼
為了測(cè)試各種數(shù)據(jù)類型(如Matlab的矩陣數(shù)據(jù)類型)的使用,本文采用稍稍復(fù)雜的Matlab測(cè)試程序:基于測(cè)距的網(wǎng)絡(luò)定位。其包含多個(gè)M文件,其中主函數(shù)代碼如下。輸入?yún)?shù)7個(gè):gCov是矩陣,其他為標(biāo)量。輸出參數(shù)2個(gè),都是矩陣。
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
其他多個(gè)M文件列表如下圖所示:

3. 將Matlab代碼打包成Jar包
(1) 在Matlab命令行窗口輸入deploytool指令,喚起打包部署工具

(2) 配置打包類型、包名、類名;選擇待打包的M的文件

(3) 等待打包完成,應(yīng)有3個(gè)對(duì)勾

(4) 打包生成的工程目錄結(jié)構(gòu)如下

4. 新建Java項(xiàng)目,調(diào)用由Matlab得到的Jar包
(1) Eclipse新建Java項(xiàng)目(不贅述)
(2) 添加兩個(gè)Jar包到Java項(xiàng)目中
Matlab安裝目錄下的Jar包:...\MATLAB\R2017a\toolbox\javabuilder\jar\javabuilder.jar前面M文件生成的Jar包:...\localization_matlab\for_redistribution_files_only\localization_matlab.jar

(3) 寫(xiě)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)化為矩陣
// 第一個(gè)參數(shù)“2”代表原Matlab函數(shù)輸出參數(shù)的個(gè)數(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]; // 第一個(gè)輸出參數(shù)
double[][] nodeLoc = (double[][]) data.toDoubleArray(); // 將矩陣轉(zhuǎn)化為二維數(shù)組
data = (MWNumericArray) result[1]; // 第二個(gè)輸出參數(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]); // 通過(guò)二維數(shù)組索引輸出矩陣中某個(gè)元素
System.out.println(pMds[0][0]);
} catch (MWException e) {
e.printStackTrace();
}
}
}
Java調(diào)用Matlab函數(shù)筆記
筆記是記錄通過(guò)java如何調(diào)用matlab函數(shù):
1.在命令行中輸入deploytool

2.點(diǎn)擊上圖中標(biāo)有紅框的部分
3.選擇javapackage,依次填寫(xiě)name,classname

在package的過(guò)程中可能會(huì)出現(xiàn)mcc錯(cuò)誤的情況
4.編寫(xiě)java類,進(jìn)行測(cè)試
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);
}
}
第一次運(yùn)行時(shí),會(huì)報(bào)如下錯(cuò)誤
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.
錯(cuò)誤原因可能是:path中沒(méi)有matlab的路徑,即找不到mclmcrrt7_14.dll這個(gè)文件,添加matlab路徑到path中就可以了
5.調(diào)用有返回結(jié)果的函數(shù)
m文件內(nèi)容:
function [f,c]=computef(key)
調(diào)用computerf函數(shù)時(shí)
Object[] result = null; result = cl.computef(2,0);//第一個(gè)參數(shù)是返回結(jié)果的個(gè)數(shù),第二個(gè)參數(shù)是實(shí)際參數(shù)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Springboot+gateway整合依賴并處理依賴沖突問(wèn)題
這篇文章主要介紹了Springboot+gateway整合依賴并處理依賴沖突問(wèn)題,給大家提到了spring boot版本和spring cloud版本,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
啟用Spring事務(wù)管理@EnableTransactionManagement示例解析
這篇文章主要為大家介紹了啟用Spring事務(wù)管理@EnableTransactionManagement示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
mybatis-plus中更新null值的問(wèn)題解決
本文主要介紹 mybatis-plus 中常使用的 update 相關(guān)方法的區(qū)別,以及更新 null 的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04
解決Java & Idea啟動(dòng)tomcat的中文亂碼問(wèn)題
這篇文章主要介紹了Java & Idea啟動(dòng)tomcat的中文亂碼問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
使用Java實(shí)現(xiàn)接口攔截器來(lái)監(jiān)控接口的執(zhí)行情況
在排查問(wèn)題的時(shí)候,由于沒(méi)有對(duì)接口的執(zhí)行情況,以及入?yún)⑦M(jìn)行監(jiān)控,所以排查起問(wèn)題就特別費(fèi)勁,今天我們就一起來(lái)寫(xiě)一個(gè)接口的攔截器來(lái)監(jiān)控接口的執(zhí)行情況吧2024-01-01
如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù)
這篇文章主要介紹了如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù),實(shí)現(xiàn)方式通過(guò)git腳本將所有的項(xiàng)目拉下來(lái)并然后通過(guò)進(jìn)行代碼行數(shù)的統(tǒng)計(jì),需要的朋友可以參考下2023-10-10
Jenkins自動(dòng)部署Net Core過(guò)程圖解
這篇文章主要介紹了Jenkins自動(dòng)部署Net Core過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12

