java调用matlab 快速计算delta值

文章介绍了如何使用MATLAB的polyfit函数进行批量数据处理来计算delta值,以及如何从Java程序中调用MATLAB进行实时计算。在MATLAB中,通过for循环和polyfit进行拟合,然后用polyval计算结果。Java端则负责构建输入数据,调用MATLAB函数并处理返回的结果。过程中需要注意MATLAB返回值的处理和数据准确性检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 调用matlab 快速计算delta

最近这段时间一直很忙,闲下来一些就把这段时间忙的东西总结下,首先由于业务需要,我们需要根据产品计算出来该产品的delta值用于判断,由于第一次接触matlab,请教了好多人,终于写出来了。

先说下思路

	1.使用matlab ,批量处理数据,需要在matlab中进行批处理数据
	2. 要了解到matlab中调用的函数,尽快计算,并处理结果
	3. 因为java调用是要实时的,同时在java调用的时候也需要一定的时间唤醒matlab,所以得想好使用什么函数
	4. java 得到数据结果之后,怎么样进行处理

matlab 处理代码

先安装matlab,我安装的时2020b版本的,比较大,

function Delt = matlabpolyfit(input)
	Delt=[];
	for i=1:length(input(1,:))/2
	    P_4=polyfit(input(:,i*2-1),input(:,i*2),4);
	    Temp=polyval(P_4,input(:,i*2-1));
	    Temp_Delt=input(:,i*2)-Temp;
	    Delt=[Delt Temp_Delt];
	end

进行一个矩阵画点,值得注意的是根据传来的数组进行取值,取下标
matlab 打成jar 包
引用同平台的博主大佬的:
添加链接描述
同时介绍了如何在idea 中调用。

Java 调用matlab

因为我这边是每一个产品有很多个温度点,根据温度点对应的ppm值进行模拟曲线图,从而得到对应的delta值。
默认条件为: 每个产品的温度点应该是一样的,即 1 产品为20个温度点,2产品也应该为20个温度点,如果温度点不一样,计算出来的delta会错误,从而影响数据的准确性

	// 计算产品的温度点
	String[] split = String.join(",", temperature).split(",");	
	//  产品的个数
    int productCodeMapSize =     productCodeHashMap.size() * 2;
    // 要传入的matlab的二维数组的大小
    double[][] inputData = new double[split.length][productCodeMapSize];
     // 拼接 二维数组
    int j = 1;
    for(String key : productCodeHashMap.keySet()) {
        List<Map<String, Object>> productCodeList = productCodeHashMap.get(key);
        List<String> frList = productCodeList.stream().map(e -> "" + e.get("FR")).collect(Collectors.toList());
        if(frList.contains("Inf")){
            break;
        }
        List<String> temperatureList = productCodeList.stream().map(e -> "" + e.get("TEMPERATURE")).collect(Collectors.toList());
        List<String> idFilterList = productCodeList.stream().map(e -> "" + e.get("ID")).collect(Collectors.toList());
        idList.addAll(idFilterList);

        String[] tempSplit = String.join(",", temperatureList).split(",");
        String[] frSplit1 = String.join(",", frList).split(",");
        int count = 0;
        while(j < productCodeHashMap.size()+1 && count<tempSplit.length-1){
            for(int i=0;i<tempSplit.length;i++){
                inputData[i][j*2-2]=Double.parseDouble(tempSplit[i]);
                inputData[i][j*2-1]=Double.parseDouble(frSplit1[i]);
                count = i;
            }
        }
        j++;
    }
     MWNumericArray ayNum = null;
    Object[] matlabpolyfit = null;
    mat mat = null;
    try {
        mat = new mat();

        ayNum = new MWNumericArray(inputData,MWClassID.SINGLE);

        matlabpolyfit = mat.matlabpolyfit(1,ayNum);
        log.error("[6]调用matlab完成!!!");
        MWNumericArray mw=(MWNumericArray)matlabpolyfit[0];
        double[] db=(mw.getDoubleData());
        log.error("[6]db.length="+db.length+",idList.size="+idList.size());
        // 需要注意:不能在一次循环中进行数据拼接
        // 如果返回的delta值 != idList  无需进行更改delta值,delta 计算错误
        if(db.length != idList.size()){
            log.error("[6]得到的delta值与主键大小不一致!!!");
            throw new Exception("delta计算错误,请查看数据");
        }
        for(int g = 0;g<db.length;g++){
            deltaList.add(""+db[g]);
        }
       
    } catch (MWException e) {
        e.printStackTrace();
        log.error("[7]MWException="+e.getStackTrace());
    }catch (Exception e){
        e.printStackTrace();
        throw new Exception(e);
    }
    finally {
        MWArray.disposeArray(ayNum);
        MWArray.disposeArray(matlabpolyfit);
        mat.dispose();
    }

自此matlab调用就全部完成,同时也能一次性获取到数据的值,因为matlab调用的时候返回的值会自动拼上自己的标识,可以查下如何避免,我第一次的时候就使用字符串处理方式全部替换,从而 进行挨个取值。
查了资料之后可以使用double[] db=(mw.getDoubleData()); 取到返回的值,从而可以一次性处理完成

自此全部处理完成,做个工作小结,方便下次使用的时候有个能找到的地方。

常总结,常进步!!! 共勉!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值