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