MATLAB使用一-编译项目SDK
在开发一个项目时需要使用java调用matlab算法执行一些计算逻辑,常规思路是将matlab文件打包成一个jar包,java项目引用这个jar包进行调用,但是实际的算法中会引入一些求解器导致jar包代码中无法调用这些求解器,导致计算失败.本文章主要介绍在有求解器的算法文件中如何将matlab文件打包成SDK部署到服务器上,通过RESTful风格API的形式进行调用.
1.安装MATLAB2024a
关注微信公众号[火耳软件安装],安装教程一步步安装,安装完成需要配置matlab运行时环境,直接在环境变量中添加即可在matlab的安装路径下找到这两个文件夹添加到path变量中
%matlab的安装路径%\bin
%matlab的安装路径%\runtime\win64
2.安装cplex求解器
参考链接:[https://blog.csdn.net/wojianguile/article/details/135508587](https://blog.csdn.net/wojianguile/article/details/135508587)3.编写MATLAB算法代码和java测试代码
参考官方文档:[https://ww2.mathworks.cn/help/compiler_sdk/mps_dev_test/test-in-process.html](https://ww2.mathworks.cn/help/compiler_sdk/mps_dev_test/test-in-process.html)3.1编写包含cplex求解器的matlab算法
写一个简单的包含cplex求解器的matlab算法function b = calc(a)
% 定义优化变量
x = sdpvar(2, 1); % 创建一个 2x1 的优化变量向量
% 定义优化问题
Constraints = [x >= a]; % 添加约束:变量 x 大于等于 a
Objective = x(1) + x(2); % 添加目标函数:最小化 x(1) + x(2)
% 设置优化参数
options = sdpsettings('verbose',2,'solver', 'cplex');
options.cplex.display='on';
% 求解优化问题
sol = optimize(Constraints, Objective, options);
% 输出结果
if sol.problem == 0
disp('最优解:');
disp(value(x)); % 输出最优解
disp(['最优目标函数值: ', num2str(value(Objective))]); % 输出最优目标函数值
else
disp('Failed to find optimal solution.');
end
b = value(Objective);
end
3.2编译算法文件
在APP中选择Production Server Complier在弹出框中添加刚刚编写的算法文件,可以选择修改Archive information,这个选项会作为api接口的根路径,还需要Include MATLAB function signature file,点击创建文件按钮会自动生成一个json文件,不需要进行修改
打开测试客户端,点击Test Client,在弹出框中需要勾选Enable CORS,支持跨域请求,不然会导致调用不成功,然后点击开始Start
3.3搭建java环境编写测试代码
搭建java环境,调用测试代码时需要mps_client.jar包和javabuilder.jar包在matlab的安装路径下找到mps_client.jar包和javabuilder.jar包,路径如下:
%matlab的安装路径%\toolbox\compiler_sdk\mps_clients\java\mps_client.jar
%matlab的安装路径%\toolbox\javabuilder\jar\javabuilder.jar
如果是maven项目可以通过依赖引用的方式添加
mvn install:install-file -Dfile=E:\MATLAB2024\toolbox\javabuilder\jar\javabuilder.jar -DgroupId=com.mathworks.toolbox -DartifactId=javabuilder -Dversion=1.0.0 -Dpackaging=jar
mvn install:install-file -Dfile=E:\MATLAB2024\toolbox\compiler_sdk\mps_clients\java\mps_client.jar -DgroupId=com.mathworks.toolbox -DartifactId=mps_client -Dversion=1.0.0 -Dpackaging=jar
在pom文件中添加项目依赖
<dependency>
<groupId>com.mathworks.toolbox</groupId>
<artifactId>javabuilder</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.mathworks.toolbox</groupId>
<artifactId>mps_client</artifactId>
<version>1.0.0</version>
</dependency>
java编写接口调用测试代码
import com.mathworks.mps.client.MATLABException;
import com.mathworks.mps.client.MWClient;
import com.mathworks.mps.client.MWHttpClient;
import java.io.IOException;
import java.net.URL;
interface Main2Test
{
Object main2(double a1)
throws MATLABException, IOException;
}
public class Main2Example {
public static void main(String[] args){
double a1= 100;
MWClient client = new MWHttpClient();
try{
Main2Test m = client.createProxy(new URL("http://localhost:9910/test"),
Main2Test.class);
Object result = m.main2(a1);
System.out.println("返回结果:"+result);
}catch(MATLABException ex){
// This exception represents errors in MATLAB
System.out.println(ex);
}catch(IOException ex){
// This exception represents network issues.
System.out.println(ex);
}finally{
client.close();
}
}
}
测试接口的执行结果
在matlab测试客户端和控制台都能看到算法调用信息
以上结果表示测试已经完成,将项目打包成cft文件,点击Pcakage按钮进行打包