矩阵碰撞算法

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;
			}
		}
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值