矩阵碰撞算法

  • y7_307109
    了解作者
  • 1KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-04-01 10:36
    上传日期
NULL 博文链接:https://coffeesweet.iteye.com/blog/317048
MatrixHit.rar
  • MatrixHit.java
    2.7KB
内容介绍
package org.ernest.matrixText; import java.util.Arrays; public class MatrixHit { /** * @param args */ public static void main(String[] args) { double [] a1={0,1,2,3,4,5,6,7,8}; double [] a2={0,1,2,3,4,5,6,7,8}; //rc(a1,a2,a1.length-1); matrixRc(a1,a2); System.out.println(Arrays.toString(a1)); System.out.println(Arrays.toString(a2)); } /** * 方正碰撞算法(等行等列)适用于元素全为正整数 * @param a * @param b */ public static void matrixRc(double[] a,double [] b){ int numRows=(int) Math.sqrt(a.length); int numColumns=numRows; double [][] aM=new double[numRows][numColumns]; double [][] bM=new double[numRows][numColumns]; for(int i=0;i<numRows;i++){ double [] aR=getRowVector(a,i); double [] bR=getRowVector(b,i); rc(aR,bR); aM[i]=aR; bM[i]=bR; } for(int i=0;i<numRows;i++){ for(int j=0;j<numColumns;j++){ a[j+i*numColumns]=aM[i][j]; b[j+i*numColumns]=bM[i][j]; } } } /** * 按行列坐标得元素值算法 * @param elements * @param nRow * @param nCol * @return */ public static double getElement(double[] elements,int nRow,int nCol){ int numColumns=(int) Math.sqrt(elements.length); return elements[nCol+nRow*numColumns]; } /** * 得行向量算法 * @param elements * @param nRow * @return */ public static double[] getRowVector(double[] elements,int nRow){ int numColumns=(int) Math.sqrt(elements.length); double[] pVector=new double[numColumns]; for(int j=0;j<numColumns;++j){ pVector[j]=getElement(elements,nRow,j); } return pVector; } /** * 单行向量碰撞算法(递归算法) */ public static void rc(double[] a,double[] b,int n){ if(n<0)return; double[] s=new double[b.length]; for(int i=0;i<b.length;i++){ if(0==i){s[i]=b[i];}else{s[i]=s[i-1]+b[i];} } if(a[n]>s[s.length-1]){ a[n]-=s[s.length-1]; Arrays.fill(b,0.0); return; }else{ int p=0; for(int i=0;i<s.length;i++){ if(a[n]<=s[i]){p=i;break;} } Arrays.fill(b, 0,(p-1)<0?0:p,0.0); b[p]=s[p]-a[n]; a[n]=0.0; rc(a,b,n-1); } } /** * 单行向量碰撞算法(循环算法) * @param a * @param b */ public static void rc(double[] a,double[] b){ for(int n=a.length-1;n>=0;n--){ double[] s=new double[b.length]; for(int i=0;i<b.length;i++){ if(0==i){s[i]=b[i];}else{s[i]=s[i-1]+b[i];} } if(a[n]>s[s.length-1]){ a[n]-=s[s.length-1]; Arrays.fill(b,0.0); return; }else{ int p=0; for(int i=0;i<s.length;i++){ if(a[n]<=s[i]){p=i;break;} } Arrays.fill(b, 0,(p-1)<0?0:p,0.0); b[p]=s[p]-a[n]; a[n]=0.0; } } } }
评论
    相关推荐