Java中使用arima預測未來數據

看著已經存在的曲線圖數據,想預估下后面曲線圖的數據。


import java.util.Vector;public class AR {double[] stdoriginalData={};int p;ARMAMath armamath=new ARMAMath();/*** AR模型* @param stdoriginalData* @param p //p為MA模型階數*/public AR(double [] stdoriginalData,int p){this.stdoriginalData=stdoriginalData;this.p=p;}/*** 返回AR模型參數* @return*/public Vector<double[]> ARmodel(){Vector<double[]> v=new Vector<double[]>();v.add(armamath.parcorrCompute(stdoriginalData, p, 0));return v;//得到了自回歸系數//還要估計方差項嗎?}}
package com.xxx.xxx.xxx.util.arima;import com.alibaba.fastjson.JSON;import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;public class ARIMA {double[] originalData={};ARMAMath armamath=new ARMAMath();double stderrDara=0;double avgsumData=0;Vector<double[]> armaARMAcoe=new Vector<double[]>();Vector<double[]> bestarmaARMAcoe=new Vector<double[]>();/*** 構造函數* @param originalData 原始時間序列數據*/public ARIMA(double [] originalData){this.originalData=originalData;}/*** 原始數據標準化處理:一階季節性差分* @return 差分過后的數據*/public double[] preDealDif(){//seasonal Difference:Peroid=7double []tempData=new double[originalData.length-7];for(int i=0;i<originalData.length-7;i++){tempData[i]=originalData[i+7]-originalData[i];}return tempData;}/*** 原始數據標準化處理:Z-Score歸一化*  待處理數據* @return 歸一化過后的數據*/public double[] preDealNor(double[] tempData){//Z-ScoreavgsumData=armamath.avgData(tempData);stderrDara=armamath.stderrData(tempData);for(int i=0;i<tempData.length;i++){tempData[i]=(tempData[i]-avgsumData)/stderrDara;}return tempData;}/*** 得到ARMA模型=[p,q]* @return ARMA模型的階數信息*/public int[] getARIMAmodel(){double[] stdoriginalData=this.preDealDif();//原始數據差分處理int paraType=0;double minAIC=9999999;int bestModelindex=0;int[][] model=new int[][]{{0,1},{1,0},{1,1},{0,2},{2,0},{2,2},{1,2},{2,1}};//,{3,0},{0,3},{3,1},{1,3},{3,2},{2,3},{3,3}};//,{4,0},{0,4},{4,1},{1,4},{4,2},{2,4},{4,3},{3,4},{4,4}};//對8種模型進行迭代,選出AIC值最小的模型作為我們的模型for(int i=0;i<model.length;i++){if(model[i][0]==0){MA ma=new MA(stdoriginalData, model[i][1]);armaARMAcoe=ma.MAmodel(); //拿到ma模型的參數paraType=1;}else if(model[i][1]==0){AR ar=new AR(stdoriginalData, model[i][0]);armaARMAcoe=ar.ARmodel(); //拿到ar模型的參數paraType=2;}else{ARMA arma=new ARMA(stdoriginalData, model[i][0], model[i][1]);armaARMAcoe=arma.ARMAmodel();//拿到arma模型的參數paraType=3;}double temp=getmodelAIC(armaARMAcoe,stdoriginalData,paraType);//System.out.println("AIC of these model="+temp);if (temp<minAIC){bestModelindex=i;minAIC=temp;bestarmaARMAcoe=armaARMAcoe;}}return model[bestModelindex];}/*** 計算ARMA模型的AIC* @param para 裝載模型的參數信息* @param stdoriginalData   預處理過后的原始數據* @param type 1:MA;2:AR;3:ARMA* @return 模型的AIC值*/public double getmodelAIC(Vector<double[]> para,double[] stdoriginalData,int type){double temp=0;double temp2=0;double sumerr=0;int p=0;//ar1,ar2,...,sig2int q=0;//sig2,ma1,ma2...int n=stdoriginalData.length;Random random=new Random();if(type==1){double[] maPara=para.get(0);q=maPara.length;double[] err=new double[q];  //error(t),error(t-1),error(t-2)...for(int k=q-1;k<n;k++){temp=0;for(int i=1;i<q;i++){temp+=maPara[i]*err[i];}//產生各個時刻的噪聲for(int j=q-1;j>0;j--){err[j]=err[j-1];}err[0]=random.nextGaussian()*Math.sqrt(maPara[0]);//估計的方差之和sumerr+=(stdoriginalData[k]-(temp))*(stdoriginalData[k]-(temp));}//return  (n-(q-1))*Math.log(sumerr/(n-(q-1)))+(q)*Math.log(n-(q-1));//AIC 最小二乘估計return (n-(q-1))*Math.log(sumerr/(n-(q-1)))+(q+1)*2;}else if(type==2){double[] arPara=para.get(0);p=arPara.length;for(int k=p-1;k<n;k++){temp=0;for(int i=0;i<p-1;i++){temp+=arPara[i]*stdoriginalData[k-i-1];}//估計的方差之和sumerr+=(stdoriginalData[k]-temp)*(stdoriginalData[k]-temp);}return (n-(q-1))*Math.log(sumerr/(n-(q-1)))+(p+1)*2;//return (n-(p-1))*Math.log(sumerr/(n-(p-1)))+(p)*Math.log(n-(p-1));//AIC 最小二乘估計}else{double[] arPara=para.get(0);double[] maPara=para.get(1);p=arPara.length;q=maPara.length;double[] err=new double[q];  //error(t),error(t-1),error(t-2)...for(int k=p-1;k<n;k++){temp=0;temp2=0;for(int i=0;i<p-1;i++){temp+=arPara[i]*stdoriginalData[k-i-1];}for(int i=1;i<q;i++){temp2+=maPara[i]*err[i];}//產生各個時刻的噪聲for(int j=q-1;j>0;j--){err[j]=err[j-1];}//System.out.println("predictBeforeDiff="+1);err[0]=random.nextGaussian()*Math.sqrt(maPara[0]);//估計的方差之和sumerr+=(stdoriginalData[k]-(temp2+temp))*(stdoriginalData[k]-(temp2+temp));}return (n-(q-1))*Math.log(sumerr/(n-(q-1)))+(p+q)*2;//return (n-(p-1))*Math.log(sumerr/(n-(p-1)))+(p+q-1)*Math.log(n-(p-1));//AIC 最小二乘估計}}/*** 對預測值進行反差分處理* @param predictValue 預測的值* @return 反差分過后的預測值*/public int aftDeal(int predictValue){//System.out.println("predictBeforeDiff="+predictValue);return (int)(predictValue+originalData[originalData.length-7]);}/*** 進行一步預測* @param p ARMA模型的AR的階數* @param q ARMA模型的MA的階數* @return 預測值*/public int predictValue(int p,int q){int predict=0;double[] stdoriginalData=this.preDealDif();int n=stdoriginalData.length;double temp=0,temp2=0;double[] err=new double[q+1];Random random=new Random();if(p==0){double[] maPara=bestarmaARMAcoe.get(0);for(int k=q;k<n;k++){temp=0;for(int i=1;i<=q;i++){temp+=maPara[i]*err[i];}//產生各個時刻的噪聲for(int j=q;j>0;j--){err[j]=err[j-1];}err[0]=random.nextGaussian()*Math.sqrt(maPara[0]);}predict=(int)(temp); //產生預測}else if(q==0){double[] arPara=bestarmaARMAcoe.get(0);for(int k=p;k<n;k++){temp=0;for(int i=0;i<p;i++){temp+=arPara[i]*stdoriginalData[k-i-1];}}predict=(int)(temp);}else{double[] arPara=bestarmaARMAcoe.get(0);double[] maPara=bestarmaARMAcoe.get(1);err=new double[q+1];  //error(t),error(t-1),error(t-2)...for(int k=p;k<n;k++){temp=0;temp2=0;for(int i=0;i<p;i++){temp+=arPara[i]*stdoriginalData[k-i-1];}for(int i=1;i<=q;i++){temp2+=maPara[i]*err[i];}//產生各個時刻的噪聲for(int j=q;j>0;j--){err[j]=err[j-1];}err[0]=random.nextGaussian()*Math.sqrt(maPara[0]);}predict=(int)(temp2+temp);}return predict;}/*** 計算MA模型的參數* @param autocorData 自相關系數Grma* @param q MA模型的階數* @return 返回MA模型的參數*/public double[] getMApara(double[] autocorData,int q){double[] maPara=new double[q+1];//第一個存放噪聲參數,后面q個存放ma參數sigma2,ma1,ma2...double[] tempmaPara=maPara;double temp=0;boolean iterationFlag=true;//解方程組//迭代法解方程組//System.out.println("autocorData[0]"+autocorData[0]);while(iterationFlag){for(int i=1;i<maPara.length;i++){temp+=maPara[i]*maPara[i];}tempmaPara[0]=autocorData[0]/(1+temp);for(int i=1;i<maPara.length;i++){temp=0;for(int j=1;j<maPara.length-i;j++){temp+=maPara[j]*maPara[j+i];}tempmaPara[i]=-(autocorData[i]/tempmaPara[0]-temp);}iterationFlag=false;for(int i=0;i<maPara.length;i++){if(maPara[i]!=tempmaPara[i]){iterationFlag=true;break;}}maPara=tempmaPara;}return maPara;}public static int[] generator(int size, List<Double> arraylist){int[] returnArray=new int[size];for (int i = 0; i <size ; i++) {double[] dataArray=new double[arraylist.size()];for(int j=0;j<arraylist.size()-1;j++) {dataArray[j] = arraylist.get(j);}//使用當前數據訓練ARIMA模型ARIMA arima=new ARIMA(dataArray);//獲得ARIM模型int []model=arima.getARIMAmodel();//System.out.println("Best model is [p,q]="+"["+model[0]+" "+model[1]+"]");//System.out.println("最佳模型是[p,q]="+"["+model[0]+" "+model[1]+"]");int deal = arima.aftDeal(arima.predictValue(model[0], model[1]));//System.out.println("Predict value="+deal);//System.out.println("預測值="+deal);//System.out.println("Predict error="+(deal-arraylist.get(arraylist.size()-1))/arraylist.get(arraylist.size()-1)*100+"%");//System.out.println("預測差值="+(deal-arraylist.get(arraylist.size()-1))/arraylist.get(arraylist.size()-1)*100+"%");arraylist.add(deal+0.0);returnArray[i]=deal;}//System.out.println(JSON.toJSON(arraylist));//System.out.println(JSON.toJSON(returnArray));return returnArray;}public static int[] arimaLists(List<Double> arraylist) {if (arraylist.size()<10){System.out.println("創建ARIMA模型數據最少10條");return new int[]{0,0,0,0,0,0,0};}int[] ints = generator(7, arraylist);return ints;}
}
package com.xxx.xxx.xxx.util.arima;import java.util.ArrayList;
import java.util.Vector;public class ARMA {double[] stdoriginalData={};int p;int q;ARMAMath armamath=new ARMAMath();/*** ARMA模型* @param stdoriginalData* @param p,q //p,q為MA模型階數*/public ARMA(double [] stdoriginalData,int p,int q){this.stdoriginalData=stdoriginalData;this.p=p;this.q=q;}public Vector<double[]> ARMAmodel(){double[] arcoe=armamath.parcorrCompute(stdoriginalData, p, q);double[] autocorData=getautocorofMA(p, q, stdoriginalData, arcoe);double[] macoe=armamath.getMApara(autocorData, q);//得到MA模型里面的參數值
//		for(int i=0;i<macoe.length;i++)
//			{
//				System.out.println(macoe[i]);
//			}
//		System.out.println();Vector<double[]> v=new Vector<double[]>();v.add(arcoe);v.add(macoe);return v;}/*** 得到MA的自相關系數* @param p* @param q* @param stdoriginalData* @param autoRegress* @return*/public double[] getautocorofMA(int p,int q,double[] stdoriginalData,double[] autoRegress){int temp=0;double[] errArray=new double[stdoriginalData.length-p];int count=0;for(int i=p;i<stdoriginalData.length;i++){temp=0;for(int j=1;j<=p;j++)temp+=stdoriginalData[i-j]*autoRegress[j-1];errArray[count++]=stdoriginalData[i]-temp;//保存估計殘差序列}return armamath.autocorGrma(errArray, q);}}
package com.xxx.xxx.xxx.util.arima;import Jama.Matrix;public class ARMAMath
{public double avgData(double[] dataArray){return this.sumData(dataArray)/dataArray.length;}public double sumData(double[] dataArray){double sumData=0;for(int i=0;i<dataArray.length;i++){sumData+=dataArray[i];}return sumData;}public double stderrData(double[] dataArray){return Math.sqrt(this.varerrData(dataArray));}public double varerrData(double[] dataArray){double variance=0;double avgsumData=this.avgData(dataArray);for(int i=0;i<dataArray.length;i++){dataArray[i]-=avgsumData;variance+=dataArray[i]*dataArray[i];}return variance/dataArray.length;//variance error;}/*** 計算自相關的函數 Tho(k)=Grma(k)/Grma(0)* @param dataArray 數列* @param order 階數* @return*/public double[] autocorData(double[] dataArray,int order){double[] autoCor=new double[order+1];double varData=this.varerrData(dataArray);//標準化過后的方差for(int i=0;i<=order;i++){autoCor[i]=0;for(int j=0;j<dataArray.length-i;j++){autoCor[i]+=dataArray[j+i]*dataArray[j];}autoCor[i]/=dataArray.length;autoCor[i]/=varData;}return autoCor;}/*** Grma* @param dataArray* @param order* @return 序列的自相關系數*/public double[] autocorGrma(double[] dataArray,int order){double[] autoCor=new double[order+1];for(int i=0;i<=order;i++){autoCor[i]=0;for(int j=0;j<dataArray.length-i;j++){autoCor[i]+=dataArray[j+i]*dataArray[j];}autoCor[i]/=(dataArray.length-i);}return autoCor;}/*** 求偏自相關系數* @param dataArray* @param order* @return*/public double[] parautocorData(double[] dataArray,int order){double parautocor[]=new double[order];for(int i=1;i<=order;i++){parautocor[i-1]=this.parcorrCompute(dataArray, i,0)[i-1];}return parautocor;}/*** 產生Toplize矩陣* @param dataArray* @param order* @return*/public double[][] toplize(double[] dataArray,int order){//返回toplize二維數組double[][] toplizeMatrix=new double[order][order];double[] atuocorr=this.autocorData(dataArray,order);for(int i=1;i<=order;i++){int k=1;for(int j=i-1;j>0;j--){toplizeMatrix[i-1][j-1]=atuocorr[k++];}toplizeMatrix[i-1][i-1]=1;int kk=1;for(int j=i;j<order;j++){toplizeMatrix[i-1][j]=atuocorr[kk++];}}return toplizeMatrix;}/*** 解MA模型的參數* @param autocorData* @param q* @return*/public double[] getMApara(double[] autocorData,int q){double[] maPara=new double[q+1];//第一個存放噪聲參數,后面q個存放ma參數sigma2,ma1,ma2...double[] tempmaPara=maPara;double temp=0;boolean iterationFlag=true;//解方程組//迭代法解方程組maPara[0]=1;//初始化while(iterationFlag){for(int i=1;i<maPara.length;i++){temp+=maPara[i]*maPara[i];}tempmaPara[0]=autocorData[0]/(1+temp);for(int i=1;i<maPara.length;i++){temp=0;for(int j=1;j<maPara.length-i;j++){temp+=maPara[j]*maPara[j+i];}tempmaPara[i]=-(autocorData[i]/maPara[0]-temp);}iterationFlag=false;for(int i=0;i<maPara.length;i++){if(maPara[i]!=tempmaPara[i]){iterationFlag=true;break;}}maPara=tempmaPara;}return maPara;}/*** 計算自回歸系數* @param dataArray* @param p* @param q* @return*/public double[] parcorrCompute(double[] dataArray,int p,int q){double[][] toplizeArray=new double[p][p];//p階toplize矩陣;double[] atuocorr=this.autocorData(dataArray,p+q);//返回p+q階的自相關函數double[] autocorrF=this.autocorGrma(dataArray, p+q);//返回p+q階的自相關系數數for(int i=1;i<=p;i++){int k=1;for(int j=i-1;j>0;j--){toplizeArray[i-1][j-1]=atuocorr[q+k++];}toplizeArray[i-1][i-1]=atuocorr[q];int kk=1;for(int j=i;j<p;j++){toplizeArray[i-1][j]=atuocorr[q+kk++];}}Matrix toplizeMatrix = new Matrix(toplizeArray);//由二位數組轉換成二維矩陣Matrix toplizeMatrixinverse=toplizeMatrix.inverse();//矩陣求逆運算double[] temp=new double[p];for(int i=1;i<=p;i++){temp[i-1]=atuocorr[q+i];}Matrix autocorrMatrix=new Matrix(temp, p);Matrix parautocorDataMatrix=toplizeMatrixinverse.times(autocorrMatrix); //  [Fi]=[toplize]x[autocorr]';//矩陣計算結果應該是按照[a b c]'  列向量存儲的//System.out.println("row="+parautocorDataMatrix.getRowDimension()+"  Col="+parautocorDataMatrix.getColumnDimension());//parautocorDataMatrix.print(p, 2);//(輸出幾行,小數點后保留位數)//System.out.println(parautocorDataMatrix.get(p-1,0));double[] result=new double[parautocorDataMatrix.getRowDimension()+1];for(int i=0;i<parautocorDataMatrix.getRowDimension();i++){result[i]=parautocorDataMatrix.get(i,0);}//估算sigmat2double sum2=0;for(int i=0;i<p;i++)for(int j=0;j<p;j++){sum2+=result[i]*result[j]*autocorrF[Math.abs(i-j)];}result[result.length-1]=autocorrF[0]-sum2; //result數組最后一個存儲干擾估計值return result;   //返回0列的最后一個就是k階的偏自相關系數 pcorr[k]=返回值}}
package com.xxx.xxx.xxx.util.arima;import java.util.Vector;public class MA {double[] stdoriginalData={};int q;ARMAMath armamath=new ARMAMath();/** MA模型* @param stdoriginalData //預處理過后的數據* @param q //q為MA模型階數*/public MA(double [] stdoriginalData,int q){this.stdoriginalData=stdoriginalData;this.q=q;}/*** 返回MA模型參數* @return*/public Vector<double[]> MAmodel(){Vector<double[]> v=new Vector<double[]>();v.add(armamath.getMApara(armamath.autocorGrma(stdoriginalData,q), q));return v;//拿到MA模型里面的參數值}}
package com.xxx.xxx.xxx.util.arima;import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;import static com.alibaba.druid.sql.ast.SQLPartitionValue.Operator.List;public class Test1 {public static void main(String args[]) {
//		extracted();ArrayList<Double> arraylist = new ArrayList<Double>();arraylist.add(1.0d);arraylist.add(2.0d);arraylist.add(3.0d);arraylist.add(4.0d);arraylist.add(5.0d);arraylist.add(6.0d);arraylist.add(7.0d);arraylist.add(8.0d);arraylist.add(8.0d);arraylist.add(8.0d);arraylist.add(8.0d);arraylist.add(8.0d);int[] ints = ARIMA.arimaLists(arraylist);System.err.println(Arrays.toString(ints));}}

以上是示例,傳入已有的參數預估后面的值
在這里插入圖片描述
當前時間為7.2號,后面一周的數據是根據之前一個月的數據預估的趨勢。
頁面上的趨勢圖只顯示前后一周。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38982.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

你的硬盤知道的太多:你以為你的秘密真的被刪除了嗎?

某一天你收到了朋友發給你的一個秘密文件&#xff0c;在看完之后&#xff0c;為了不被別人發現&#xff0c;你決定將文件毀尸滅跡&#xff01; 你選中文件名稱 / 右鍵 / 刪除&#xff0c;好了&#xff0c;文件已經消失了。但你是懂電腦的&#xff0c;知道文件此時還在回收站里面…

Ozon/Noon/Temu/TK Shop如何多店鋪經營免受關聯封號?

許多商家和個人都面臨著多店鋪經營免受關聯封號的挑戰。特別是在像Ozon、Noon、TEMU以及TikTok Shop等平臺上&#xff0c;如何有效管理多個店鋪并避免關聯封號成為關鍵問題。 一、多店鋪經營防關聯封號的重要性&#xff1a; 在多店鋪經營過程中&#xff0c;如果平臺檢測到多個…

海外虛擬卡開卡平臺有哪些?無限開卡,無其他限制

隨著時代的發展很多小伙伴都需要海外虛擬卡&#xff0c;海外虛擬卡開卡平臺我這里用的是Fomepay的&#xff0c;他們比較人性化&#xff0c;有客服&#xff0c;隨時可咨詢 對于消費者而言&#xff0c;虛擬卡號提供了隱私&#xff0c;因此廣告商更難以跟蹤和定位購買行為&#x…

PyQt5入門教程:從安裝到構建簡單應用

PyQt5入門教程&#xff1a;從安裝到構建簡單應用 簡介 PyQt5是一個功能強大的Python綁定庫&#xff0c;用于Qt應用程序框架。它允許我們使用Python語言快速開發跨平臺的桌面應用程序。本教程將引導你完成PyQt5的安裝、配置&#xff0c;并帶你創建一個簡單的圖形用戶界面&…

《python程序語言設計》2018版第5章第50題利用turtle編程顯示三角形圖案

2024.06.18 05.50.01version 首先我覺得還是應該現從簡單陣列來進行。非常簡單。順便回憶一下我3月份做的5.19題里那些淘氣的數列 代碼成功 #將i從10設計成12打印的畢竟好看 for i in range(1,12):#這這里給結尾的i2效果并不好看for j in range(1,i):print(j,end" "…

【深度學習】Transformer

李宏毅深度學習筆記 https://blog.csdn.net/Tink1995/article/details/105080033 https://blog.csdn.net/leonardotu/article/details/135726696 https://blog.csdn.net/u012856866/article/details/129790077 Transformer 是一個基于自注意力的序列到序列模型&#xff0c;與基…

軟件測試與質量保證 | 云班課選擇題庫

目錄 第1章課后習題 第2章課后習題 第3章課后習題 第4章課后習題 第5章課后習題 第6章課后習題 第7章課后習題 第8章課后習題 第9章課后習題 第10章課后習題 第11章課后習題 第12章課后習題 第13章 測試相關未分類習題 第1章課后習題 1. 與質量相關的概念包括 &a…

51單片機第26步_單片機工作在空閑模式

重點學習51單片機工作在空閑模式。 1、進入空閑模式的方法 通過將PCON寄存器中的IDLE置1&#xff0c;CPU就會進入空閑模式。在空閑模式中&#xff0c;程序停止執行&#xff0c;RAM中的數據仍然保持&#xff0c;晶振繼續工作&#xff0c;但與CPU斷開&#xff0c;定時器和串行口…

IPython調試秘籍:pdb調試器深度解析與實戰

&#x1f41e; IPython調試秘籍&#xff1a;pdb調試器深度解析與實戰 在Python編程中&#xff0c;調試是開發過程中不可或缺的一環。IPython&#xff0c;作為一個強大的交互式Python解釋器&#xff0c;內置了pdb調試器&#xff0c;使得代碼調試變得異常便捷。本文將深入探討如…

可充電紐扣電池ML2032充電電路設計

如圖&#xff0c;可充電紐扣電池ML2032充電電路設計。 圖中二極管是為了防止電流倒灌&#xff0c; 電阻分壓出3.66v&#xff0c;再減掉二極管壓降&#xff08;約0.4v)得3.26V&#xff0c;加在電池正負極充電。 隨著電池電量的積累&#xff0c;充電電流逐步減小&#xff0c;極限…

什么樣的企業適合SD-WAN網絡專線?

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;軟件定義廣域網&#xff09;是一種網絡技術&#xff0c;它利用軟件定義的方式管理和控制廣域網&#xff08;WAN&#xff09;&#xff0c;旨在提高網絡效率、降低成本并簡化網絡管理。以下是適合采用SD-WAN網絡…

服務器之BIOS基礎知識總結

1.BIOS是什么&#xff1f; BIOS全稱Basic Input Output System&#xff0c;即基本輸入輸出系統&#xff0c;是固化在服務器主板的專用ROM上&#xff0c;加載在服務器硬件系統上最基本的運行程序&#xff0c;它位于服務器硬件和OS之間&#xff0c;在服務器啟動過程中首先運行&am…

C語言在QC工作當中的應用

一、引入 在質量控制&#xff08;Quality Control&#xff0c;簡稱QC&#xff09;工作中&#xff0c;C語言的應用可能并不像在一些其他領域&#xff08;如嵌入式系統開發、游戲開發等&#xff09;中那么直接&#xff0c;但C語言仍然可以在多個方面為QC提供支持。以下是一些C語…

擺脫冗雜賦值(一)——巧用序列化反序列化及BeanUtils反射等工具解決開發時對象、集合、字符串等多種形式間相互轉換的方法及技巧

1、將Java對象轉換為JSON字符串 當我們需要將Java對象轉換為JSON字符串時&#xff0c;可以使用JSON.toJSONString()方法。下面是一個簡單的例子&#xff0c;展示如何使用JSON.toJSONString()將一個Java對象轉換為JSON字符串&#xff1a; import com.alibaba.fastjson.JSON;pu…

HUAWEI MPLS 靜態配置和動態LDP配置

MPLS(Multi-Protocol Label Switching&#xff0c;多協議標簽交換技術)技術的出現&#xff0c;極大地推動了互聯網的發展和應用。例如&#xff1a;利用MPLS技術&#xff0c;可以有效而靈活地部署VPN(Virtual Private Network&#xff0c;虛擬專用網)&#xff0c;TE(Traffic Eng…

Rust 進階教程

Rust 進階教程 在基礎教程中&#xff0c;我們已經了解了Rust的基本語法和核心概念。本文將進一步探討Rust的進階特性和應用&#xff0c;包括泛型、閉包、迭代器、異步編程、宏和unsafe代碼等。 目錄 泛型閉包和迭代器 閉包迭代器 異步編程宏Unsafe代碼FFI&#xff08;外部函…

pdf怎么拆分成一頁一頁?4種拆分方法分享

在日常的辦公學習中&#xff0c;PDF文檔因其跨平臺、易閱讀、不易篡改等特性&#xff0c;成為我們工作和學習中不可或缺的一部分。然而&#xff0c;當我們需要對PDF進行編輯、打印或分享時&#xff0c;有時需要將整個PDF文檔拆分成一頁一頁的單獨文件。那么&#xff0c;如何高效…

深入理解Vue生命周期鉤子函數

深入理解Vue生命周期鉤子函數 Vue.js 是一款流行的前端框架&#xff0c;通過其強大的響應式數據綁定和組件化的開發方式&#xff0c;使得前端開發變得更加簡單和高效。在Vue應用中&#xff0c;每個組件都有其生命周期&#xff0c;這些生命周期鉤子函數允許開發者在不同階段執行…

2024 AIGC 技術創新應用研討會暨數字造型設計師高級研修班通知

尊敬的老師、領導您好! 為深入響應國家關于教育綜合改革的戰略部署&#xff0c;深化職業教育、高等教育改革&#xff0c;發揮企業主體重要作用&#xff0c;促進人才培養供給側和產業需求側結構要素全方位融合&#xff0c;充分把握人工智能創意式生成(AIGC)技術在教育領域的發展…

【ruoyi】docker 項目實戰

一、引言 介紹ruoyi(若依)框架 本項目使用若依前后臺分離框架 https://gitee.com/ranmaxli/basic-business-platform 解釋為什么選擇Docker進行項目開發 使用docker是因為方便數據遷移、部署、管理 二、Docker基礎知識 Docker基本概念 容器與虛擬機