示例#1
0
void matrix_setup(complex_array& A)
{	int n = 4;
	A.get(0,0) = 3.0;
	A.get(0,1) =1.0;
	A.get(0,2) =-4.0;
	A.get(0,3) =2.0;
	A.get(1,0) =3.0;
	A.get(1,1) =1.0;
	A.get(1,2) =0.0;
	A.get(1,3) =2.0;
	A.get(2,0) =2.0;
	A.get(2,1) =13.0;
	A.get(2,2) =-1.0;
	A.get(2,3) =0.0;
	A.get(3,0) =-2.0;
	A.get(3,1) =3.0;
	A.get(3,2) =-1.0;
	A.get(3,3) =4.0;
	for (int i = 1; i < n; i++ )
	{
		for (int j = 0; j < i; j++ )
			std::swap(A.get(i,j),A.get(j,i));
	}
}
示例#2
0
void lu_decompose_burke(int n, complex_array& a, int_array& ip, int ndim)
{	
/*C
C Un-transpose the matrix for Gauss elimination
C
      DO 12 I=2,N
         DO 11 J=1,I-1
            ARJ=A(I,J)
            A(I,J)=A(J,I)
            A(J,I)=ARJ
11 CONTINUE
12 CONTINUE
*/
// 	for (int i = 1; i < n; i++ )
// 	{
// 		for (int j = 0; j < i; j++ )
// 			std::swap(a.get(i,j),a.get(j,i));
// 	}

 /*
     IFLG=0
      DO 9 R=1,N
*/
	complex_array d(n);
	for (int r = 0; r < n; r++ )
	{
		bool iflg=false;
/*C
C STEP 1
C
      DO 1 K=1,N
      D(K)=A(K,R)
1 CONTINUE*/
		for (int k = 0; k < n; k++ )
			d[k]= a.get(k,r);

/*
C
C STEPS 2 AND 3
C
      RM1=R-1
      IF (RM1.LT.1) GO TO 4
      DO 3 J=1,RM1
      PJ=IP(J)
      ARJ=D(PJ)
      A(J,R)=ARJ
      D(PJ)=D(J)
      JP1=J+1
      DO 2 I=JP1,N
      D(I)=D(I)-A(I,J)*ARJ
2 CONTINUE
3 CONTINUE
4 CONTINUE
*/
		int rm1 = r - 1;
		if (rm1 >= 0)
		{
			for (int j=0; j < r; j++)
			{
				int pj = ip[j];
				nec_complex arj = d[pj];
				a.set(j,r,arj);
				d[pj] = d[j];
				int jp1 = j + 1;
				for (int i=jp1;i<n;i++)
					d[i] -= a.get(i,j)*arj;
			}
		}
/*
C
C STEP 4
C
      DMAX=REAL(D(R)*CONJG(D(R)))
      IP(R)=R
      RP1=R+1
      IF (RP1.GT.N) GO TO 6
      DO 5 I=RP1,N
      ELMAG=REAL(D(I)*CONJG(D(I)))
      IF (ELMAG.LT.DMAX) GO TO 5
      DMAX=ELMAG
      IP(R)=I
5 CONTINUE
6 CONTINUE
      IF (DMAX.LT.1.E-10) IFLG=1
      PR=IP(R)
      A(R,R)=D(PR)
      D(PR)=D(R)
*/
		nec_float dmax = norm(d[r]);;
		ip[r] = r;
		int rp1 = r + 1;
		if (rp1 < n)
		{
			for (int i=rp1; i<n; i++)
			{
				nec_float elmag = norm(d[i]);
				if (elmag >= dmax)
				{
					dmax = elmag;
					ip[r] = i;
				}
			}
		}
		if (dmax < 1e-10)
			iflg = true;
		int pr = ip[r];
		a.set(r,r,d[pr]);
		d[pr] = d[r];

/*
C
C STEP 5
C
      IF (RP1.GT.N) GO TO 8
      ARJ=1./A(R,R)
      DO 7 I=RP1,N
      A(I,R)=D(I)*ARJ
7 CONTINUE
8 CONTINUE
*/
		if (rp1 < n)
		{
			nec_complex arj = cplx_10() / a.get(r,r);
			for (int i=rp1; i<n; i++)
			{
				a.set(i,r,d[i] * arj);
			}
		}
/*
      IF (IFLG.EQ.0) GO TO 9
      WRITE(3,10) R,DMAX
      IFLG=0
*/
		if (iflg == true)
		{
			cout << "FACTR: PIVOT(" << r << ")=" << dmax;
			iflg = false;
		}
	} 

	// increment ip array
	for (int i=0;i<n;i++)
		ip[i] += 1;
/*
	cout << "solved = ";
	to_octave(a,n,ndim);

	cout << "ip = ";
	to_octave(ip,n);
	*/
}