由于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);
}