home *** CD-ROM | disk | FTP | other *** search
- mtrm_mlt(Q,Q,D);
- for ( i = 0; i < D->m; i++ )
- m_set_val(D,i,i,m_entry(D,i,i)-1.0);
- if ( m_norm1(D) >= MACHEPS*m_norm1(Q)*m_norm_inf(Q)*3 )
- {
- errmesg("symmeig()");
- printf("# symmeig() orthogonality error = %g [cf MACHEPS = %g]\n",
- m_norm1(D), MACHEPS);
- }
-
- MEMCHK();
-
- /* now test (real) Schur decomposition */
- /* m_copy(A,B); */
- M_FREE(A);
- A = m_get(11,11);
- m_rand(A);
- B = m_copy(A,B);
- MEMCHK();
-
- B = schur(B,Q);
- MEMCHK();
-
- m_mlt(Q,B,C);
- mmtr_mlt(C,Q,D);
- MEMCHK();
- m_sub(A,D,D);
- if ( m_norm1(D) >= MACHEPS*m_norm1(Q)*m_norm_inf(Q)*m_norm1(B)*5 )
- {
- errmesg("schur()");
- printf("# Schur reconstruction error = %g [cf MACHEPS = %g]\n",
- m_norm1(D), MACHEPS);
- }
-
- /* orthogonality check */
- mmtr_mlt(Q,Q,D);
- for ( i = 0; i < D->m; i++ )
- m_set_val(D,i,i,m_entry(D,i,i)-1.0);
- if ( m_norm1(D) >= MACHEPS*m_norm1(Q)*m_norm_inf(Q)*10 )
- {
- errmesg("schur()");
- printf("# Schur orthogonality error = %g [cf MACHEPS = %g]\n",
- m_norm1(D), MACHEPS);
- }
-
- MEMCHK();
-
- /* check for termination */
- Atmp = m_get(2,2);
- Qtmp = m_get(2,2);
- /* this is a 2 x 2 matrix with real eigenvalues */
- Atmp->me[0][0] = 1;
- Atmp->me[1][1] = 1;
- Atmp->me[0][1] = 4;
- Atmp->me[1][0] = 1;
- schur(Atmp,Qtmp);
-
- MEMCHK();
-
- /* now test SVD */
- A = m_resize(A,11,7);
- m_rand(A);
- U = m_get(A->n,A->n);
- Q = m_resize(Q,A->m,A->m);
- u = v_resize(u,max(A->m,A->n));
- svd(A,Q,U,u);
- /* check reconstruction of A */
- D = m_resize(D,A->m,A->n);
- C = m_resize(C,A->m,A->n);
- m_zero(D);
- for ( i = 0; i < min(A->m,A->n); i++ )
- m_set_val(D,i,i,v_entry(u,i));
- mtrm_mlt(Q,D,C);
- m_mlt(C,U,D);
- m_sub(A,D,D);
- if ( m_norm1(D) >= MACHEPS*m_norm1(U)*m_norm_inf(Q)*m_norm1(A) )
- {
- errmesg("svd()");
- printf("# SVD reconstruction error = %g [cf MACHEPS = %g]\n",
- m_norm1(D), MACHEPS);
- }
- /* check orthogonality of Q and U */
- D = m_resize(D,Q->n,Q->n);
- mtrm_mlt(Q,Q,D);
- for ( i = 0; i < D->m; i++ )
- m_set_val(D,i,i,m_entry(D,i,i)-1.0);
- if ( m_norm1(D) >= MACHEPS*m_norm1(Q)*m_norm_inf(Q)*5 )
- {
- errmesg("svd()");
- printf("# SVD orthognality error (Q) = %g [cf MACHEPS = %g\n",
- m_norm1(D), MACHEPS);
- }
- D = m_resize(D,U->n,U->n);
- mtrm_mlt(U,U,D);
- for ( i = 0; i < D->m; i++ )
- m_set_val(D,i,i,m_entry(D,i,i)-1.0);
- if ( m_norm1(D) >= MACHEPS*m_norm1(U)*m_norm_inf(U)*5 )
- {
- errmesg("svd()");
- printf("# SVD orthognality error (U) = %g [cf MACHEPS = %g\n",
- m_norm1(D), MACHEPS);
- }
- for ( i = 0; i < u->dim; i++ )
- if ( v_entry(u,i) < 0 || (i < u->dim-1 &&
- v_entry(u,i+1) > v_entry(u,i)) )
- break;
- if ( i < u->dim )
- {
- errmesg("svd()");
- printf("# SVD sorting error\n");
- }
-
-
- /* test of long vectors */
- notice("Long vectors");
- x = v_resize(x,100000);
- y = v_resize(y,100000);
- z = v_resize(z,100000);
- v_rand(x);
- v_rand(y);
- v_mltadd(x,y,3.0,z);
- sv_mlt(1.0/3.0,z,z);
- v_mltadd(z,x,-1.0/3.0,z);
- v_sub(z,y,x);
- if (v_norm2(x) >= MACHEPS*(x->dim)) {
- errmesg("long vectors");
- printf(" norm = %g\n",v_norm2(x));
- }
-
- mem_stat_free(1);
-
- MEMCHK();
-
- /**************************************************
- VEC *x, *y, *z, *u, *v, *w;
- VEC *diag, *beta;
- PERM *pi1, *pi2, *pi3, *pivot, *blocks;
- MAT *A, *B, *C, *D, *Q, *U;
- **************************************************/
- V_FREE(x); V_FREE(y); V_FREE(z);
- V_FREE(u); V_FREE(v); V_FREE(w);
- V_FREE(diag); V_FREE(beta);
- PX_FREE(pi1); PX_FREE(pi2); PX_FREE(pi3);
- PX_FREE(pivot); PX_FREE(blocks);
- M_FREE(A); M_FREE(B); M_FREE(C);
- M_FREE(D); M_FREE(Q); M_FREE(U);
- M_FREE(Atmp); M_FREE(Qtmp);
-
- MEMCHK();
- printf("# Finished torture test\n");
- mem_info();
-
- return 0;
- }
-
- FileDataŵtutadv † Eÿÿÿ@ò X Â
- /* routines from the section 8 of tutorial.txt */
-
- #include "matrix.h"
-
- #define M3D_LIST 3 /* list number */
- #define TYPE_MAT3D 0 /* the number of a type */
-
- /* type for 3 dimensional matrices */
- typedef struct {
- int l,m,n; /* actual dimensions */
- int max_l, max_m, max_n; /* maximal dimensions */
- Real ***me; /* pointer to matrix elements */
- /* we do not consider segmented memory */
- Real *base, **me2d; /* me and me2d are additional pointers
- to base */
- } MAT3D;
-
-
- /* function for creating a variable of MAT3D type */
-
- MAT3D *m3d_get(l,m,n)
- int l,m,n;
- {
- MAT3D *mat;
- int i,j,k;
-
- /* check if arguments are positive */
- if (l <= 0 || m <= 0 || n <= 0)
- error(E_NEG,"m3d_get");
-
- /* new structure */
- if ((mat = NEW(MAT3D)) == (MAT3D *)NULL)
- error(E_MEM,"m3d_get");
- else if (mem_info_is_on()) {
- /* record how many bytes is allocated */
- mem_bytes_list(TYPE_MAT3D,0,sizeof(MAT3D),M3D_LIST);
- /* record a new allocated variable */
- mem_numvar_list(TYPE_MAT3D,1,M3D_LIST);
- }
-
- mat->l = mat->max_l = l;
- mat->m = mat->max_m = m;
- mat->n = mat->max_n = n;
-
- /* allocate memory for 3D array */
- if ((mat->base = NEW_A(l*m*n,Real)) == (Real *)NULL)
- error(E_MEM,"m3d_get");
- else if (mem_info_is_on())
- mem_bytes_list(TYPE_MAT3D,0,l*m*n*sizeof(Real),M3D_LIST);
-
- /* allocate memory for 2D pointers */
- if ((mat->me2d = NEW_A(l*m,Real *)) == (Real **)NULL)
- error(E_MEM,"m3d_get");
- else if (mem_info_is_on())
- mem_bytes_list(TYPE_MAT3D,0,l*m*sizeof(Real *),M3D_LIST);
-
- /* allocate memory for 1D pointers */
- if ((mat->me = NEW_A(l,Real **)) == (Real ***)NULL)
- error(E_MEM,"m3d_get");
- else if (mem_info_is_on())
- mem_bytes_list(TYPE_MAT3D,0,l*sizeof(Real **),M3D_LIST);
-
- /* pointers to 2D matrices */
- for (i=0,k=0; i < l; i++)
- for (j=0; j < m; j++)
- mat->me2d[k++] = &mat->base[