ActionScript3(AS)版本的簡單StringBuilder Flash版的TDMA算法

由於String的操作都是創建了一個新的對象,效率較低,故C#和java都有StringBuilder。寫了一個AS3版本的StringBuilder,他日測試效率:

package Soong.CC.utilities
{
 public class StringBuilder
 {
  public var sep:String="\n";
  
  private var strings:Array=new Array();
  
  public function StringBuilder()
  {
   
  }
  
  public function Append(string:String):void
  {
   strings.push(string);
  }
  
  public function toString():String
  {
   return strings.join(sep);
  }
 }
}


TDMA算法:計算三對角係數矩陣的方程組:

private function idxA(i:int,j:int):int {return i*2+j-2};
private function idxL(i:int,j:int):int {return i+j-2};
private function idxU(i:int,j:int):int {return i-1};
private function idxb(i:int):int {return i-1};
private function idxz(i:int):int {return i-1};

private var L:Vector.<Number>=new Vector.<Number>();
private var U:Vector.<Number>=new Vector.<Number>();
private var Z:Vector.<Number>=new Vector.<Number>();

private function SolveByTDMA(dim:int, A:Vector.<Number>, b:Vector.<Number>, root:Vector.<Number>):void
{
	/*
	TDMA method
	
	For Linear Equation Ax=b 
	=>  LUx=b
	=>  Lz=b  
	=>  Ux=z
	*/
	
	var i:int=0;
	
	// Step 1
	L[idxL(1,1)]=A[idxA(1,1)];
	U[idxU(1,2)]=A[idxA(1,2)]/L[idxL(1,1)];
	Z[idxz(1)]=b[idxb(1)]/L[idxL(1,1)];
	
	//Step 2
	for (i=2;i<dim;i++)
	{
		L[idxL(i,i-1)]=A[idxA(i,i-1)];
		L[idxL(i,i)]=A[idxA(i,i)]-L[idxL(i,i-1)]*U[idxU(i-1,i)];
		U[idxU(i,i+1)]=A[idxA(i,i+1)]/L[idxL(i,i)];
		Z[idxz(i)]=(b[idxb(i)]-L[idxL(i,i-1)]*Z[idxz(i-1)])/L[idxL(i,i)];
	}
	
	//Step 3, Now i=n
	L[idxL(i,i-1)]=A[idxA(i,i-1)];
	L[idxL(i,i)]=A[idxA(i,i)]-L[idxL(i,i-1)]*U[idxU(i-1,i)];
	Z[idxz(i)]=(b[idxb(i)]-L[idxL(i,i-1)]*Z[idxz(i-1)])/L[idxL(i,i)];
	
	//Step 4
	root[dim-1]=Z[dim-1];
	
	//Step 5
	for (i=dim-1;i>0;i--)
	{
		root[i-1]=Z[idxz(i)]-U[idxU(i,i+1)]*root[i];
	}
}

private function TestSolver():void
{
	var A:Vector.<Number>=new <Number>[0,1,2,
		2,3,4,
		4,5,6,
		6,7,8];
	
	var b:Vector.<Number>=new <Number>[3,9,15,13];
	
	var root:Vector.<Number>=new <Number>[0,0,0,0];
	
	SolveByTDMA(4,A,b,root);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章