Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
cs_symeig.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 #include <stdio.h>
00008 #include <math.h>
00009 #include <stdlib.h>
00010 #include "eispack.h"
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 void symeig_double( int n , double *a , double *e )
00026 {
00027    integer nm , matz , ierr ;
00028    double *fv1 , *fv2 ;
00029 
00030    if( a == NULL || e == NULL || n < 1 ) return ;
00031 
00032    if( n == 1 ){
00033      e[0] = a[0] ; a[0] = 1.0 ; return ;  
00034    }
00035 
00036    fv1 = (double *) malloc(sizeof(double)*n) ;  
00037    fv2 = (double *) malloc(sizeof(double)*n) ;
00038 
00039    nm = n ; matz = 1 ; ierr = 0 ;
00040 
00041    rs_( &nm , &nm , a , e , &matz , a , fv1 , fv2 , &ierr ) ;
00042 
00043    free((void *)fv1) ; free((void *)fv2) ;
00044    return ;
00045 }
00046 
00047 
00048 
00049 void symeigval_double( int n , double *a , double *e )
00050 {
00051    integer nm , matz , ierr ;
00052    double *fv1 , *fv2 ;
00053 
00054    if( a == NULL || e == NULL || n < 1 ) return ;
00055 
00056    if( n == 1 ){ e[0] = a[0] ; return ; } 
00057 
00058    fv1 = (double *) malloc(sizeof(double)*n) ;  
00059    fv2 = (double *) malloc(sizeof(double)*n) ;
00060 
00061    nm = n ; matz = 0 ; ierr = 0 ;
00062 
00063    rs_( &nm , &nm , a , e , &matz , a , fv1 , fv2 , &ierr ) ;
00064 
00065    free((void *)fv1) ; free((void *)fv2) ;
00066    return ;
00067 }
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 void svd_double( int m , int n , double *a , double *s , double *u , double *v )
00082 {
00083    integer mm,nn , lda,ldu,ldv , ierr ;
00084    doublereal *aa, *ww , *uu , *vv , *rv1 ;
00085    logical    matu , matv ;
00086 
00087    if( a == NULL || s == NULL || m < 1 || n < 1 ) return ;
00088 
00089    mm  = m ;
00090    nn  = n ;
00091    aa  = a ;
00092    lda = m ;
00093    ww  = s ;
00094 
00095    if( u == NULL ){
00096      matu = (logical) 0 ;
00097      uu   = (doublereal *)malloc(sizeof(double)*m*n) ;
00098    } else {
00099      matu = (logical) 1 ;
00100      uu = u ;
00101    }
00102    ldu = m ;
00103 
00104    if( v == NULL ){
00105      matv = (logical) 0 ;
00106      vv   = NULL ;
00107    } else {
00108      matv = (logical) 1 ;
00109      vv = v ;
00110    }
00111    ldv = n ;
00112 
00113    rv1 = (double *) malloc(sizeof(double)*n) ;  
00114 
00115    (void) svd_( &mm , &nn , &lda , aa , ww ,
00116                 &matu , &ldu , uu , &matv , &ldv , vv , &ierr , rv1 ) ;
00117 
00118    free((void *)rv1) ;
00119 
00120    if( u == NULL ) free((void *)uu) ;
00121    return ;
00122 }
00123 
00124 #if 0
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 void svd_float( int m , int n , float *a , float *s , float *u , float *v )
00138 {
00139    integer mm,nn , lda,ldu,ldv , ierr ;
00140    doublereal *aa, *ww , *uu , *vv , *rv1 ;
00141    logical    matu , matv ;
00142 
00143    int ii ;
00144 
00145    if( a == NULL || s == NULL || m < 1 || n < 1 ) return ;
00146 
00147    mm  = m ;
00148    nn  = n ;
00149    aa  = (doublereal *)malloc(sizeof(double)*m*n) ;
00150    lda = m ;
00151    ww  = (doublereal *)malloc(sizeof(double)*n) ;
00152 
00153    for( ii=0 ; ii < m*n ; ii++ ) aa[ii] = (doublereal)a[ii] ;
00154 
00155    matu = (logical) 1 ;
00156    uu   = (doublereal *)malloc(sizeof(double)*m*n) ;
00157    ldu  = m ;
00158 
00159    matv = (logical) 1 ;
00160    vv   = (doublereal *)malloc(sizeof(double)*n*n) ;
00161    ldv  = n ;
00162 
00163    rv1 = (double *) malloc(sizeof(double)*n) ;  
00164 
00165    (void) svd_( &mm , &nn , &lda , aa , ww ,
00166                 &matu , &ldu , uu , &matv , &ldv , vv , &ierr , rv1 ) ;
00167 
00168    free((void *)rv1) ; free((void *)aa) ;
00169 
00170    
00171 
00172    for( ii=0 ; ii < n ; ii++ ) s[ii] = (float)ww[ii] ;
00173 
00174    if( u != NULL )
00175      for( ii=0 ; ii < m*n ; ii++ ) u[ii] = (float)uu[ii] ;
00176 
00177    if( v != NULL )
00178      for( ii=0 ; ii < n*n ; ii++ ) v[ii] = (float)vv[ii] ;
00179 
00180    free((void *)uu) ; free((void *)vv) ;
00181    return ;
00182 }
00183 #endif