如何在Eclipse(2017年12月版,JDK10)中用Java运行Matlab文件?
Got it, let's walk through exactly how to get your Matlab .m and .mat files running in Eclipse 2017-12 with JDK 10, and make sure you get the exact same output as you do in the Matlab desktop. I’ve set this up a few times before, so here’s the step-by-step breakdown that should work for you:
1. 前置准备
- 首先确保你的电脑上装了Matlab R2018a及以上版本——因为JDK 10是2018年发布的,Matlab从R2018a开始正式支持JDK 10,版本不兼容的话后续会出各种奇怪的错误。
- 找到Matlab的Java引擎库:在你的Matlab安装目录里,导航到
extern\engines\java,这里面有我们需要的matlabengine.jar,还有对应系统的本地库文件(Windows是.dll,Linux是.so,Mac是.dylib)。
2. 配置Eclipse项目
- 打开Eclipse 2017-12,新建一个Java项目,创建的时候记得选择JDK 10作为项目的JRE(别选错成其他版本了)。
- 右键你的项目 →
Build Path→Add External JARs,找到刚才的matlabengine.jar并添加到项目里。 - 接下来配置本地库(这步很关键,不然会报找不到本地库的错误):
- 右键项目 →
Build Path→Configure Build Path,切换到Libraries标签页。 - 展开刚添加的
matlabengine.jar,双击Native library location,点击External Folder,选择Matlab引擎的本地库目录(比如Windows下是Matlab安装目录\extern\engines\java\win64,Linux是.../glnxa64)。
- 右键项目 →
- 最后设置环境变量:确保系统的
PATH环境变量包含Matlab的bin目录(比如Windows下是Matlab安装目录\bin\win64),或者你也可以在Eclipse的运行配置里添加这个路径到Environment变量中。
3. 运行Matlab .m函数文件的具体实现
假设你有一个mySumFunction.m函数,内容是这样的:
function total = mySumFunction(num1, num2) total = num1 + num2; disp(['计算结果:', num2str(total)]); % 和Matlab桌面一样输出日志 end
在Java里调用这个函数的代码如下:
import com.mathworks.engine.MatlabEngine; public class RunMatlabFunc { public static void main(String[] args) throws Exception { // 启动Matlab引擎 MatlabEngine matlabEng = MatlabEngine.startMatlab(); // 把你的.m文件所在的文件夹添加到Matlab的搜索路径!这步绝对不能忘 matlabEng.eval("addpath('D:\\MyMatlabFiles')"); // 替换成你实际的.m文件路径 // 调用函数,传入参数并获取返回值 double result = matlabEng.feval("mySumFunction", 10, 25); // 输出结果,和Matlab桌面的输出一致 System.out.println("Java端获取的Matlab函数结果:" + result); // 用完记得关闭引擎 matlabEng.close(); } }
- 如果你的.m函数不需要参数,直接用
matlabEng.feval("yourFuncName")就行;如果函数返回多个结果,可以用Object[] results = matlabEng.feval("yourFunc", arg1, arg2...)来接收所有返回值。 - 要是你的.m脚本没有函数定义(就是纯脚本代码),直接用
matlabEng.eval("run('D:\\MyMatlabFiles\\myScript.m')")就能运行。
4. 读取并处理.mat文件
如果你要读取.mat文件里的数据,比如文件里有一个名为testMatrix的二维矩阵,代码可以这么写:
import com.mathworks.engine.MatlabEngine; import com.mathworks.matlab.types.Matrix; public class ReadMatFile { public static void main(String[] args) throws Exception { MatlabEngine matlabEng = MatlabEngine.startMatlab(); // 加载.mat文件 matlabEng.eval("load('D:\\MyMatlabFiles\\testData.mat')"); // 获取文件里的变量 Matrix matrixData = matlabEng.getVariable("testMatrix"); // 输出数据,和Matlab桌面查看的结果一致 System.out.println("Mat文件中的矩阵行数:" + matrixData.getRowCount()); System.out.println("Mat文件中的矩阵列数:" + matrixData.getColumnCount()); for (int i = 0; i < matrixData.getRowCount(); i++) { for (int j = 0; j < matrixData.getColumnCount(); j++) { System.out.print(matrixData.getDouble(i, j) + " "); } System.out.println(); } // 如果要修改数据并保存回.mat文件 // matlabEng.setVariable("updatedMatrix", new Matrix(new double[][]{{1,2},{3,4}})); // matlabEng.eval("save('updatedData.mat', 'updatedMatrix')"); matlabEng.close(); } }
5. 常见坑点排查
- 运行前确保Matlab没有在后台运行,不然会启动引擎失败。
- 遇到
UnsatisfiedLinkError?检查本地库路径和PATH环境变量是否配置正确,或者Matlab版本和JDK版本是否兼容。 - Matlab找不到你的.m文件?再检查
addpath的路径是否正确,或者直接把.m文件放到Java项目的根目录下试试。 - 输出和Matlab桌面不一致?检查你的.m函数是否依赖其他未添加路径的文件,或者参数传递是否正确(比如Matlab索引从1开始,Java从0开始,处理数组时要注意)。
内容的提问来源于stack exchange,提问作者sameer_nubia
相关产品推荐
相关产品推荐

