java后台链接matlab(springboot),只需要启动一次matlab即可,可以在服务端运行(超简单,亲测可用)

有些时候我们可能会遇到要写非常复杂的算法,或者是要处理奇怪的数据(比如巨大的矩阵)。

这个时候我们想实现这些复杂的算法,自己实现或许是一件很艰难或者是不可能的事情,因此分享一个使用springboot配置连接matlab的方式

首先,导入相关的包,springboot之类的包就不再赘述了。重点是下面这个。

        <dependency>
            <groupId>org.n52.matlab</groupId>
            <artifactId>matlab-control</artifactId>
            <version>5.0.0</version>
        </dependency>

有件事情需要注意一下,我的matlab版本是R2016a,内置的java版本是1.7,我的后台使用的jdk是1.8的,这并没有出现什么奇怪的问题,但是我不能保证其他版本会不会出现问题。因此这里需要注意一下。

导入包之后,在springboot的配置中加入如下代码。

 

/**下面这段代码非常重要,有了这段代码,你的matlab才不会反复启动,文件结构如上图所示,具体的springboot配置大家可以参阅别的博客,这里不再重复说了。**/

import org.n52.matlab.control.MatlabConnectionException;
import org.n52.matlab.control.MatlabProxy;
import org.n52.matlab.control.MatlabProxyFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MatlabConfiguration {

    @Bean(name = "matlab")
    public MatlabProxy createFactory() throws MatlabConnectionException {
        MatlabProxyFactory factory = new MatlabProxyFactory();
        MatlabProxy proxy = factory.getProxy();
        System.out.println("启动matlab");
        return proxy;

    }
}

注意!需要把使用到的**.m文件(把你自己编写的函数放在里面)放到根目录下!就是和你的springboot项目的pom.xml文件放在同一个文件夹下!

至此,就已经完成了基本的配置。

接下来看看调用的方式。单元测试的调用方式。

    @Test
    public void testA() throws MatlabConnectionException, MatlabInvocationException {
        MatlabProxyFactory factory = new MatlabProxyFactory();
        MatlabProxy proxy = factory.getProxy();
        Object[] result = proxy.returningFeval("demo", 5, a);//第一次参数是你需要用到的函数的名称,第二个参数是返回的结果的数量,第三个、第四个...第N个参数都是你需要输入的参数        具体查看包的文档,不再赘述。

 

下面引用一位大佬的接收方式,很清晰。

//返回的结果,是一个数组形式,所以用数组接收,下面为我取得第一个返回的参数f的值。

     double[] r=(double[]) result[0];
            System.out.print("f:");
            for (int i = 0; i < r.length; i++) {
                System.out.print(r[i]);
            }

// 但返回的数组中,可能会返回对象,比如这的output,最后一个参数,就这样接收

Object[] r4=(Object[]) result[4];
            String[] key=(String[]) r4[0];
            for (int i = 0; i < key.length; i++) {
                System.out.println(key[i]);
            }

//反正就是去看结果的结构,根据对象类型一级一级的取值
————————————————
版权声明:本文为CSDN博主「黎明小书生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27731689/article/details/81068516

 

到这里大家会发现一个问题,每次执行单元测试,都是会重新启动matlab呀!不要着急。下面一行代码搞定服务端启动(不算上面的配置的话,嘻嘻嘻)。

   /**这段代码为了方便起见,直接加到你的项目的controller层就行了。

就像这样

 @Autowired
    private MatlabProxy proxy;

接下来的调用方式就不用我再多说啦,大家都懂了。

 Object[] result = proxy.returningFeval("demo", 5, a);

剩下的事情就交给各位使用者们尽情发挥想象啦。

如有疏漏,请各路大神不吝赐教,谢谢。祝新年快乐。

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值