Doxygen Source Code Documentation
matrix_f.h File Reference
#include "machdep.h"Go to the source code of this file.
Typedef Documentation
|
|
|
|
|
|
Function Documentation
|
||||||||||||||||||||
|
Convert simple array to matrix structure. Definition at line 397 of file matrix.c. References cols, matrix::elts, i, matrix_create(), and rows. Referenced by calc_reduced_model(), and read_glt_matrix().
|
|
||||||||||||||||
|
Convert simple array f into vector v. Definition at line 943 of file matrix.c. References vector::elts, i, v, and vector_create_noinit(). Referenced by calc_reduced_model(), form_clusters(), and print_cluster().
|
|
||||||||||||||||
|
Convert column c of matrix m into vector v. Definition at line 960 of file matrix.c. References c, matrix::elts, vector::elts, i, matrix::rows, v, and vector_create_noinit(). Referenced by init_delay(), and init_regression_analysis().
|
|
||||||||||||||||
|
Add matrix a to matrix b. Result is matrix c. Definition at line 506 of file matrix.c. References a, c, matrix::cols, cols, matrix::elts, flops, i, matrix_create(), matrix_error(), matrix::rows, and rows. Referenced by ComputeDeltaTau(), and matrix_sqrt().
00507 {
00508 register int rows, cols;
00509 register int i, j;
00510
00511 if ((a.rows != b.rows) || (a.cols != b.cols))
00512 matrix_error ("Incompatible dimensions for matrix addition");
00513
00514 rows = a.rows;
00515 cols = a.cols;
00516
00517 matrix_create (rows, cols, c);
00518
00519 for (i = 0; i < rows; i++)
00520 for (j = 0; j < cols; j++)
00521 c->elts[i][j] = a.elts[i][j] + b.elts[i][j];
00522
00523 #ifdef ENABLE_FLOPS
00524 flops += rows*cols ;
00525 #endif
00526 }
|
|
||||||||||||
|
Search a matrix for nearly identical column pairs, where "nearly identical" means they are correlated closer than 1-eps. Return is a pointer to an int array of the form [ i1 j1 i2 j2 ... -1 -1 ] where columns (i1,j1) are nearly the same, (i2,j2) also, etc. In addition:
Definition at line 1309 of file matrix.c. References a, matrix::cols, cols, matrix::elts, i, realloc, matrix::rows, and rows. Referenced by calculate_results().
01310 {
01311 int i,j,k , rows=a.rows , cols=a.cols ;
01312 int *iar=NULL , nar=0 ;
01313 double sumi,sumj,sumd ;
01314
01315 if( eps <= 0.0 ) eps = 1.e-5 ;
01316
01317 for( i=0 ; i < cols ; i++ ){
01318 sumi = 0.0 ;
01319 for( k=0 ; k < rows ; k++ ) sumi += a.elts[k][i] * a.elts[k][i] ;
01320 if( sumi <= 0.0 ){
01321 iar = (int *)realloc( (void *)iar , sizeof(int)*2*(nar+1) ) ;
01322 iar[2*nar] = i ; iar[2*nar+1] = -1 ; nar++ ;
01323 continue ; /* skip to next column i */
01324 }
01325 for( j=i+1 ; j < cols ; j++ ){
01326 sumj = sumd = 0.0 ;
01327 for( k=0 ; k < rows ; k++ ){
01328 sumj += a.elts[k][j] * a.elts[k][j] ;
01329 sumd += a.elts[k][j] * a.elts[k][i] ;
01330 }
01331 if( sumj > 0.0 ){
01332 sumd = fabs(sumd) / sqrt(sumi*sumj) ;
01333 if( sumd >= 1.0-eps ){
01334 iar = (int *)realloc( (void *)iar , sizeof(int)*2*(nar+1) ) ;
01335 iar[2*nar] = i ; iar[2*nar+1] = j ; nar++ ;
01336 }
01337 }
01338 }
01339 }
01340
01341 if( iar != NULL ){
01342 iar = (int *)realloc( (void *)iar , sizeof(int)*2*(nar+1) ) ;
01343 iar[2*nar] = iar[2*nar+1] = -1 ;
01344 }
01345
01346 return iar ;
01347 }
|
|
||||||||||||||||
|
Create matrix data structure by allocating memory and initializing values. Definition at line 181 of file matrix.c. References calloc, matrix::cols, cols, matrix::elts, i, malloc, matrix::mat, matrix_destroy(), matrix_error(), matrix::rows, and rows. Referenced by analyze_results(), array_to_matrix(), calc_covariance(), ComputeD0(), ComputeNewD(), cubic_spline(), Form_R_Matrix(), get_inputs(), init_indep_var_matrix(), InitGlobals(), matrix_add(), matrix_enter(), matrix_equate(), matrix_extract(), matrix_extract_rows(), matrix_file_read(), matrix_identity(), matrix_multiply(), matrix_psinv(), matrix_scale(), matrix_subtract(), matrix_transpose(), niml_to_matrix(), and poly_field().
00182 {
00183 register int i ;
00184
00185 matrix_destroy (m);
00186
00187 if ((rows < 0) || (cols < 0))
00188 matrix_error ("Illegal dimensions for new matrix");
00189
00190 m->rows = rows;
00191 m->cols = cols;
00192 if ((rows < 1) || (cols < 1)) return;
00193
00194 m->elts = (double **) malloc (sizeof(double *) * rows);
00195 if (m->elts == NULL)
00196 matrix_error ("Memory allocation error");
00197
00198 #ifdef DONT_USE_MATRIX_MAT
00199 for (i = 0; i < rows; i++){
00200 m->elts[i] = (double *) calloc (sizeof(double) , cols);
00201 if (m->elts[i] == NULL) matrix_error ("Memory allocation error");
00202 }
00203 #else
00204 m->mat = (double *) calloc( sizeof(double) , rows*cols ) ;
00205 if( m->mat == NULL )
00206 matrix_error ("Memory allocation error");
00207 for (i = 0; i < rows; i++)
00208 m->elts[i] = m->mat + (i*cols) ; /* 04 Mar 2005: offsets into mat */
00209 #endif
00210 }
|
|
|
|
Manual entry of matrix data. Definition at line 297 of file matrix.c. References cols, matrix::elts, i, matrix_create(), and rows.
00298 {
00299 int rows, cols;
00300 int i, j;
00301 float fval;
00302
00303 printf ("Enter number of rows: "); fflush(stdout) ;
00304 scanf ("%d", &rows);
00305 printf ("Enter number of cols: "); fflush(stdout) ;
00306 scanf ("%d", &cols);
00307
00308 matrix_create (rows, cols, m);
00309
00310 for (i = 0; i < rows; i++)
00311 for (j = 0; j < cols; j++)
00312 {
00313 printf ("elts[%d][%d] = ", i, j); fflush(stdout);
00314 scanf ("%f", &fval);
00315 m->elts[i][j] = fval;
00316 }
00317 }
|
|
||||||||||||
|
Make a copy of the first matrix, return copy as the second matrix. Definition at line 414 of file matrix.c. References a, matrix::cols, cols, matrix::elts, i, matrix_create(), matrix::rows, and rows. Referenced by init_indep_var_matrix(), matrix_inverse(), matrix_inverse_dsc(), and matrix_sqrt().
00415 {
00416 register int i, j;
00417 register int rows, cols;
00418
00419 rows = a.rows;
00420 cols = a.cols;
00421
00422 matrix_create (rows, cols, b);
00423
00424 for (i = 0; i < rows; i++){
00425 #if 0
00426 for (j = 0; j < cols; j++)
00427 b->elts[i][j] = a.elts[i][j];
00428 #else
00429 if( cols > 0 )
00430 memcpy( b->elts[i] , a.elts[i] , sizeof(double)*cols ) ; /* RWCox */
00431 #endif
00432 }
00433 }
|
|
|
Routine to print and error message and stop. Definition at line 132 of file matrix.c. Referenced by matrix_add(), matrix_create(), matrix_file_read(), matrix_file_write(), matrix_identity(), matrix_inverse(), matrix_inverse_dsc(), matrix_multiply(), matrix_sqrt(), matrix_subtract(), vector_add(), vector_create(), vector_create_noinit(), vector_dot(), vector_multiply(), vector_multiply_subtract(), and vector_subtract().
00133 {
00134 printf ("Matrix error: %s \n", message);
00135 exit (1);
00136 }
|
|
||||||||||||||||||||
|
Extract p columns (specified by list) from matrix a. Result is matrix b. Definition at line 441 of file matrix.c. References a, cols, matrix::elts, i, matrix_create(), p, matrix::rows, and rows. Referenced by calc_matrices().
|
|
||||||||||||||||||||
|
Extract p rows (specified by list) from matrix a. Result is matrix b. Definition at line 462 of file matrix.c. References a, matrix::cols, cols, matrix::elts, i, matrix_create(), p, and rows. Referenced by init_indep_var_matrix().
|
|
||||||||||||||||||||||||
|
Read contents of matrix m from specified file. If unable to read matrix from file, or matrix has wrong dimensions: If error_exit flag is set, then print error message and exit. Otherwise, return null matrix. Definition at line 328 of file matrix.c. References cols, matrix::elts, error_exit(), far, i, matrix_create(), matrix_destroy(), matrix_error(), MRI_FLOAT_PTR, mri_free(), mri_read_1D(), MRI_IMAGE::nx, MRI_IMAGE::ny, and rows. Referenced by DC_main(), do_xrestore_stuff(), markov_array(), read_glt_matrix(), and read_input_data().
00330 {
00331 int i, j;
00332
00333 MRI_IMAGE * im, * flim; /* pointers to image structures
00334 -- used to read ASCII file */
00335 float * far; /* pointer to MRI_IMAGE floating point data */
00336 char message [80]; /* error message */
00337
00338
00339 /*----- First, check for empty file name -----*/
00340 if (filename == NULL) matrix_error ("Missing matrix file name");
00341
00342
00343 /*----- Read the matrix file -----*/
00344 flim = mri_read_1D(filename);
00345 if (flim == NULL)
00346 if (error_exit)
00347 {
00348 sprintf (message, "Unable to read matrix from file: %s", filename);
00349 matrix_error (message);
00350 }
00351 else
00352 {
00353 matrix_destroy (m);
00354 return;
00355 }
00356
00357
00358 /*----- Set pointer to data -----*/
00359 far = MRI_FLOAT_PTR(flim);
00360
00361
00362 /*----- Test for correct dimensions -----*/
00363 if ( (rows != flim->nx) || (cols != flim->ny) )
00364 if (error_exit)
00365 {
00366 sprintf (message,
00367 "In matrix file: %s Expected: %d x %d Actual: %d x %d",
00368 filename, rows, cols, flim->nx, flim->ny);
00369 matrix_error (message);
00370 }
00371 else
00372 {
00373 matrix_destroy (m);
00374 return;
00375 }
00376
00377
00378 matrix_create (rows, cols, m);
00379
00380
00381 /*----- Copy data from image structure to matrix structure -----*/
00382 for (i = 0; i < rows; i++)
00383 for (j = 0; j < cols; j++)
00384 m->elts[i][j] = far[i + j*rows];
00385
00386
00387 mri_free (flim); flim = NULL;
00388
00389 }
|
|
||||||||||||
|
Print contents of matrix m to specified file. Definition at line 265 of file matrix.c. References matrix::cols, cols, matrix::elts, i, matrix_error(), matrix::rows, and rows.
00266 {
00267 int i, j;
00268 int rows, cols;
00269 FILE * outfile = NULL;
00270
00271
00272 /*----- First, check for empty file name -----*/
00273 if (filename == NULL) matrix_error ("Missing matrix file name");
00274
00275
00276 outfile = fopen (filename, "w");
00277
00278 rows = m.rows;
00279 cols = m.cols;
00280
00281 for (i = 0; i < rows; i++)
00282 {
00283 for (j = 0; j < cols; j++)
00284 fprintf (outfile, " %g", m.elts[i][j]);
00285 fprintf (outfile, " \n");
00286 }
00287 fprintf (outfile, " \n");
00288
00289 fclose (outfile);
00290 }
|
|
||||||||||||
|
Create n x n identity matrix. Definition at line 483 of file matrix.c. References matrix::elts, i, matrix_create(), and matrix_error(). Referenced by calc_glt_matrix(), form_clusters(), matrix_inverse(), and matrix_sqrt().
00484 {
00485 register int i, j;
00486
00487 if (n < 0)
00488 matrix_error ("Illegal dimensions for identity matrix");
00489
00490 matrix_create (n, n, m);
00491
00492 for (i = 0; i < n; i++)
00493 for (j = 0; j < n; j++)
00494 if (i == j)
00495 m->elts[i][j] = 1.0;
00496 else
00497 m->elts[i][j] = 0.0;
00498 }
|
|
|
Initialize matrix data structure. Definition at line 144 of file matrix.c. References matrix::cols, matrix::elts, matrix::mat, and matrix::rows. Referenced by analyze_results(), calc_covariance(), calc_glt_matrix(), calc_linear_regression(), calc_matrices(), calc_reduced_model(), calculate_results(), ComputeD0(), ComputeDeltaTau(), ComputeHpHm(), ComputeNewD(), cubic_spline(), do_xrestore_stuff(), form_clusters(), Form_R_Matrix(), init_delay(), init_indep_var_matrix(), init_regression_analysis(), InitGlobals(), initialize_options(), initialize_program(), markov_array(), matrix_destroy(), matrix_inverse(), matrix_inverse_dsc(), matrix_sqrt(), poly_field(), and read_input_data().
|
|
||||||||||||
|
Use Gaussian elimination to calculate inverse of matrix a. Result is matrix ainv. Definition at line 641 of file matrix.c. References a, matrix::cols, matrix::elts, flops, i, matrix_destroy(), matrix_equate(), matrix_error(), matrix_identity(), matrix_initialize(), matrix_sprint(), p, and matrix::rows. Referenced by analyze_results(), calc_covariance(), calc_linear_regression(), cubic_spline(), matrix_inverse_dsc(), matrix_sqrt(), and poly_field().
00642 {
00643 const double epsilon = 1.0e-10;
00644 matrix tmp;
00645 register int i, j, ii, n;
00646 register double fval;
00647 register double fmax;
00648 register double * p;
00649
00650 matrix_initialize (&tmp);
00651
00652
00653 if (a.rows != a.cols)
00654 matrix_error ("Illegal dimensions for matrix inversion");
00655
00656 #if 0
00657 matrix_sprint("matrix_inverse:",a) ;
00658 #endif
00659
00660 n = a.rows;
00661 matrix_identity (n, ainv);
00662 matrix_equate (a, &tmp);
00663
00664 for (i = 0; i < n; i++)
00665 {
00666 fmax = fabs(tmp.elts[i][i]);
00667 for (j = i+1; j < n; j++)
00668 if (fabs(tmp.elts[j][i]) > fmax)
00669 {
00670 fmax = fabs(tmp.elts[j][i]);
00671 p = tmp.elts[i];
00672 tmp.elts[i] = tmp.elts[j];
00673 tmp.elts[j] = p;
00674 p = ainv->elts[i];
00675 ainv->elts[i] = ainv->elts[j];
00676 ainv->elts[j] = p;
00677 }
00678
00679 if (fmax < epsilon)
00680 {
00681 matrix_destroy (&tmp);
00682 return (0);
00683 }
00684
00685
00686 fval = 1.0 / tmp.elts[i][i]; /* RWCox: change division by this to */
00687 for (j = 0; j < n; j++) /* multiplication by 1.0/this */
00688 {
00689 tmp.elts[i][j] *= fval;
00690 ainv->elts[i][j] *= fval;
00691 }
00692 for (ii = 0; ii < n; ii++)
00693 if (ii != i)
00694 {
00695 fval = tmp.elts[ii][i];
00696 for (j = 0; j < n; j++)
00697 {
00698 tmp.elts[ii][j] -= fval*tmp.elts[i][j];
00699 ainv->elts[ii][j] -= fval*ainv->elts[i][j];
00700 }
00701 }
00702
00703 }
00704 matrix_destroy (&tmp);
00705 #ifdef ENABLE_FLOPS
00706 flops += 3.0*n*n*n ;
00707 #endif
00708 return (1);
00709 }
|
|
||||||||||||
|
Use Gaussian elimination to calculate inverse of matrix a, with diagonal scaling applied for stability. Result is matrix ainv. Definition at line 718 of file matrix.c. References a, matrix::cols, matrix::elts, flops, free, i, malloc, matrix_destroy(), matrix_equate(), matrix_error(), matrix_initialize(), matrix_inverse(), and matrix::rows. Referenced by calc_glt_matrix(), and calc_matrices().
00719 {
00720 matrix atmp;
00721 register int i, j, n;
00722 register double *diag ;
00723 int mir ;
00724
00725 if (a.rows != a.cols)
00726 matrix_error ("Illegal dimensions for matrix inversion");
00727
00728 matrix_initialize (&atmp);
00729
00730 n = a.rows;
00731 matrix_equate (a, &atmp);
00732 diag = (double *)malloc( sizeof(double)*n ) ;
00733 for( i=0 ; i < n ; i++ ){
00734 diag[i] = fabs(atmp.elts[i][i]) ;
00735 if( diag[i] == 0.0 ) diag[i] = 1.0 ; /* shouldn't happen? */
00736 diag[i] = 1.0 / sqrt(diag[i]) ;
00737 }
00738
00739 for( i=0 ; i < n ; i++ ) /* scale a */
00740 for( j=0 ; j < n ; j++ )
00741 atmp.elts[i][j] *= diag[i]*diag[j] ;
00742
00743 mir = matrix_inverse( atmp , ainv ) ; /* invert */
00744
00745 for( i=0 ; i < n ; i++ ) /* scale inverse */
00746 for( j=0 ; j < n ; j++ )
00747 ainv->elts[i][j] *= diag[i]*diag[j] ;
00748
00749 matrix_destroy (&atmp); free((void *)diag) ;
00750 #ifdef ENABLE_FLOPS
00751 flops += 4.0*n*n + 4.0*n ;
00752 #endif
00753 return (mir);
00754 }
|
|
||||||||||||||||
|
Multiply matrix a by matrix b. Result is matrix c. Definition at line 562 of file matrix.c. References a, c, matrix::cols, cols, matrix::elts, flops, i, matrix_create(), matrix_error(), matrix::rows, and rows. Referenced by analyze_results(), calc_glt_matrix(), calc_linear_regression(), calc_matrices(), ComputeD0(), ComputeDeltaTau(), ComputeHpHm(), ComputeNewD(), matrix_sqrt(), and poly_field().
00563 {
00564 int rows, cols;
00565 register int i, j, k;
00566 register double sum ;
00567
00568 if (a.cols != b.rows)
00569 matrix_error ("Incompatible dimensions for matrix multiplication");
00570
00571 rows = a.rows;
00572 cols = b.cols;
00573
00574 matrix_create (rows, cols, c);
00575
00576 for (i = 0; i < rows; i++)
00577 for (j = 0; j < cols; j++)
00578 {
00579 sum = 0.0 ;
00580 for (k = 0; k < a.cols; k++)
00581 sum += a.elts[i][k] * b.elts[k][j];
00582 c->elts[i][j] = sum;
00583 }
00584
00585 #ifdef ENABLE_FLOPS
00586 flops += 2.0*rows*cols*cols ;
00587 #endif
00588 }
|
|
|
Compute the L_infinity norm of a matrix: the max absolute row sum. Definition at line 1278 of file matrix.c. References a, matrix::cols, cols, matrix::elts, flops, i, matrix::rows, and rows.
01279 {
01280 int i,j , rows=a.rows, cols=a.cols ;
01281 double sum , smax=0.0 ;
01282
01283 for (i = 0; i < rows; i++){
01284 sum = 0.0 ;
01285 for (j = 0; j < cols; j++) sum += fabs(a.elts[i][j]) ;
01286 if( sum > smax ) smax = sum ;
01287 }
01288 #ifdef ENABLE_FLOPS
01289 flops += 2.0*rows*cols ;
01290 #endif
01291 return smax ;
01292 }
|
|
|
Print contents of matrix m. Definition at line 218 of file matrix.c. References matrix::cols, cols, matrix::elts, i, matrix::rows, rows, and zork. Referenced by calculate_results(), matrix_sprint(), and read_glt_matrix().
00219 {
00220 int i, j;
00221 int rows, cols;
00222 double val ;
00223 int ipr ;
00224
00225 rows = m.rows;
00226 cols = m.cols;
00227
00228 for( i=0 ; i < rows ; i++ ){
00229 for( j=0 ; j < cols ; j++ ){
00230 val = (int)m.elts[i][j] ;
00231 if( val != m.elts[i][j] || fabs(val) > 9.0 ) goto zork ;
00232 }
00233 }
00234 zork:
00235 ipr = (i==rows && j==cols) ;
00236
00237 for (i = 0; i < rows; i++)
00238 {
00239 for (j = 0; j < cols; j++)
00240 if( ipr ) printf (" %2d" , (int)m.elts[i][j]);
00241 else printf (" %10.4g", m.elts[i][j]);
00242 printf (" \n");
00243 }
00244 printf (" \n"); fflush(stdout) ;
00245 }
|
|
||||||||||||||||
|
Given MxN matrix X, return the NxN matrix [ T ]-1 [ T ]-1 T [ X X ] and the NxM matrix [ X X ] X ----------------------------------------------------------------------------- Definition at line 1399 of file matrix.c. References calloc, matrix::cols, matrix::elts, flops, free, matrix_create(), matrix::rows, and svd_double(). Referenced by calc_matrices(), and Form_R_Matrix().
01400 {
01401 int m = X.rows , n = X.cols , ii,jj,kk ;
01402 double *amat , *umat , *vmat , *sval , *xfac , smax,del,sum ;
01403
01404 if( m < 1 || n < 1 || m < n || (XtXinv == NULL && XtXinvXt == NULL) ) return;
01405
01406 amat = (double *)calloc( sizeof(double),m*n ) ; /* input matrix */
01407 umat = (double *)calloc( sizeof(double),m*n ) ; /* left singular vectors */
01408 vmat = (double *)calloc( sizeof(double),n*n ) ; /* right singular vectors */
01409 sval = (double *)calloc( sizeof(double),n ) ; /* singular values */
01410 xfac = (double *)calloc( sizeof(double),n ) ; /* column norms of [a] */
01411
01412 #define A(i,j) amat[(i)+(j)*m]
01413 #define U(i,j) umat[(i)+(j)*m]
01414 #define V(i,j) vmat[(i)+(j)*n]
01415
01416 /* copy input matrix into amat */
01417
01418 for( ii=0 ; ii < m ; ii++ )
01419 for( jj=0 ; jj < n ; jj++ ) A(ii,jj) = X.elts[ii][jj] ;
01420
01421 /* scale each column to have norm 1 */
01422
01423 for( jj=0 ; jj < n ; jj++ ){
01424 sum = 0.0 ;
01425 for( ii=0 ; ii < m ; ii++ ) sum += A(ii,jj)*A(ii,jj) ;
01426 if( sum > 0.0 ) sum = 1.0/sqrt(sum) ;
01427 xfac[jj] = sum ;
01428 for( ii=0 ; ii < m ; ii++ ) A(ii,jj) *= sum ;
01429 }
01430
01431 /* compute SVD of scaled matrix */
01432
01433 svd_double( m , n , amat , sval , umat , vmat ) ;
01434
01435 free((void *)amat) ; /* done with this */
01436
01437 /* find largest singular value */
01438
01439 smax = sval[0] ;
01440 for( ii=1 ; ii < n ; ii++ )
01441 if( sval[ii] > smax ) smax = sval[ii] ;
01442
01443 if( smax <= 0.0 ){ /* this is bad */
01444 free((void *)xfac); free((void *)sval);
01445 free((void *)vmat); free((void *)umat); return;
01446 }
01447
01448 for( ii=0 ; ii < n ; ii++ )
01449 if( sval[ii] < 0.0 ) sval[ii] = 0.0 ;
01450
01451 #ifdef FLOATIZE
01452 #define PSINV_EPS 1.e-8
01453 #else
01454 #define PSINV_EPS 1.e-16
01455 #endif
01456
01457 /* "reciprocals" of singular values: 1/s is actually s/(s^2+del) */
01458
01459 del = PSINV_EPS * smax*smax ;
01460 for( ii=0 ; ii < n ; ii++ )
01461 sval[ii] = sval[ii] / ( sval[ii]*sval[ii] + del ) ;
01462
01463 /* create pseudo-inverse */
01464
01465 if( XtXinvXt != NULL ){
01466 matrix_create( n , m , XtXinvXt ) ;
01467 for( ii=0 ; ii < n ; ii++ ){
01468 for( jj=0 ; jj < m ; jj++ ){
01469 sum = 0.0 ;
01470 for( kk=0 ; kk < n ; kk++ )
01471 sum += sval[kk] * V(ii,kk) * U(jj,kk) ;
01472 XtXinvXt->elts[ii][jj] = sum * xfac[ii] ;
01473 }
01474 }
01475 }
01476
01477 if( XtXinv != NULL ){
01478 matrix_create( n , n , XtXinv ) ;
01479 for( ii=0 ; ii < n ; ii++ ) sval[ii] = sval[ii] * sval[ii] ;
01480 matrix_create( n , n , XtXinv ) ;
01481 for( ii=0 ; ii < n ; ii++ ){
01482 for( jj=0 ; jj < n ; jj++ ){
01483 sum = 0.0 ;
01484 for( kk=0 ; kk < n ; kk++ )
01485 sum += sval[kk] * V(ii,kk) * V(jj,kk) ;
01486 XtXinv->elts[ii][jj] = sum * xfac[ii] * xfac[jj] ;
01487 }
01488 }
01489 }
01490
01491 #ifdef ENABLE_FLOPS
01492 flops += n*n*(n+2.0*m+2.0) ;
01493 #endif
01494 free((void *)xfac); free((void *)sval);
01495 free((void *)vmat); free((void *)umat); return;
01496 }
|
|
||||||||||||||||
|
Multiply matrix a by scalar constant k. Result is matrix c. Definition at line 565 of file matrix_f.c. References a, c, matrix::cols, cols, matrix::elts, i, matrix_create(), matrix::rows, and rows. Referenced by matrix_sqrt().
|
|
|
Return the eigenvalues of matrix X-transpose X. The output points to a vector of doubles, of length X.cols. This should be free()-ed when you are done with it. ----------------------------------------------------------------------------- Definition at line 1355 of file matrix.c. References a, matrix::cols, matrix::elts, flops, free, i, malloc, matrix::rows, and symeigval_double(). Referenced by calculate_results().
01356 {
01357 int i,j,k , M=X.rows , N=X.cols ;
01358 double *a , *e , sum ;
01359
01360 a = (double *) malloc( sizeof(double)*N*N ) ;
01361 e = (double *) malloc( sizeof(double)*N ) ;
01362
01363 for( i=0 ; i < N ; i++ ){
01364 for( j=0 ; j <= i ; j++ ){
01365 sum = 0.0 ;
01366 for( k=0 ; k < M ; k++ ) sum += X.elts[k][i] * X.elts[k][j] ;
01367 a[j+N*i] = sum ;
01368 if( j < i ) a[i+N*j] = sum ;
01369 }
01370 }
01371
01372 for( i=0 ; i < N ; i++ ){
01373 if( a[i+N*i] > 0.0 ) e[i] = 1.0 / sqrt(a[i+N*i]) ;
01374 else e[i] = 1.0 ;
01375 }
01376 for( i=0 ; i < N ; i++ ){
01377 for( j=0 ; j < N ; j++ ) a[j+N*i] *= e[i]*e[j] ;
01378 }
01379
01380 symeigval_double( N , a , e ) ;
01381 free( (void *)a ) ;
01382 #ifdef ENABLE_FLOPS
01383 flops += (M+N+2.0)*N*N ;
01384 #endif
01385 return e ;
01386 }
|
|
||||||||||||
|
Print label and contents of matrix m. Definition at line 253 of file matrix.c. References matrix_print(). Referenced by calc_covariance(), calculate_results(), markov_array(), matrix_inverse(), and poly_field().
00254 {
00255 printf ("%s \n", s);
00256 matrix_print (m);
00257 }
|
|
||||||||||||
|
Calculate square root of symmetric positive definite matrix a. Result is matrix s. Definition at line 763 of file matrix.c. References a, matrix::cols, matrix::elts, i, matrix_add(), matrix_destroy(), matrix_equate(), matrix_error(), matrix_identity(), matrix_initialize(), matrix_inverse(), matrix_multiply(), matrix_scale(), matrix_subtract(), and matrix::rows. Referenced by calc_covariance().
00764 {
00765 const int MAX_ITER = 100;
00766 int n;
00767 int ok;
00768 int iter;
00769 register float sse, psse;
00770 register int i, j;
00771 matrix x, xinv, axinv, xtemp, error;
00772
00773 matrix_initialize (&x);
00774 matrix_initialize (&xinv);
00775 matrix_initialize (&axinv);
00776 matrix_initialize (&xtemp);
00777 matrix_initialize (&error);
00778
00779
00780 if (a.rows != a.cols)
00781 matrix_error ("Illegal dimensions for matrix square root");
00782
00783
00784 n = a.rows;
00785 matrix_identity (n, &x);
00786
00787
00788 psse = 1.0e+30;
00789 for (iter = 0; iter < MAX_ITER; iter++)
00790 {
00791 ok = matrix_inverse (x, &xinv);
00792 if (! ok) return (0);
00793 matrix_multiply (a, xinv, &axinv);
00794 matrix_add (x, axinv, &xtemp);
00795 matrix_scale (0.5, xtemp, &x);
00796
00797 matrix_multiply (x, x, &xtemp);
00798 matrix_subtract (a, xtemp, &error);
00799 sse = 0.0;
00800 for (i = 0; i < n; i++)
00801 for (j = 0; j < n; j++)
00802 sse += error.elts[i][j] * error.elts[i][j] ;
00803
00804 if (sse >= psse) break;
00805
00806 psse = sse;
00807 }
00808
00809 if (iter == MAX_ITER) return (0);
00810
00811 matrix_equate (x, s);
00812
00813 matrix_destroy (&x);
00814 matrix_destroy (&xinv);
00815 matrix_destroy (&axinv);
00816 matrix_destroy (&xtemp);
00817
00818 return (1);
00819
00820 }
|
|
||||||||||||||||
|
Subtract matrix b from matrix a. Result is matrix c. Definition at line 534 of file matrix.c. References a, c, matrix::cols, cols, matrix::elts, flops, i, matrix_create(), matrix_error(), matrix::rows, and rows. Referenced by calc_glt_matrix(), and matrix_sqrt().
00535 {
00536 register int rows, cols;
00537 register int i, j;
00538
00539 if ((a.rows != b.rows) || (a.cols != b.cols))
00540 matrix_error ("Incompatible dimensions for matrix subtraction");
00541
00542 rows = a.rows;
00543 cols = a.cols;
00544
00545 matrix_create (rows, cols, c);
00546
00547 for (i = 0; i < rows; i++)
00548 for (j = 0; j < cols; j++)
00549 c->elts[i][j] = a.elts[i][j] - b.elts[i][j];
00550
00551 #ifdef ENABLE_FLOPS
00552 flops += rows*cols ;
00553 #endif
00554 }
|
|
||||||||||||
|
Take transpose of matrix a. Result is matrix t. Definition at line 621 of file matrix.c. References a, matrix::cols, cols, matrix::elts, i, matrix_create(), matrix::rows, and rows. Referenced by analyze_results(), calc_glt_matrix(), calc_linear_regression(), calc_matrices(), calculate_results(), ComputeNewD(), and poly_field().
|
|
||||||||||||||||
|
Add vector a to vector b. Result is vector c. Definition at line 993 of file matrix.c. References a, c, vector::dim, vector::elts, flops, i, matrix_error(), and vector_create_noinit().
00994 {
00995 register int i, dim;
00996
00997 if (a.dim != b.dim)
00998 matrix_error ("Incompatible dimensions for vector addition");
00999
01000 dim = a.dim;
01001
01002 vector_create_noinit (dim, c);
01003
01004 for (i = 0; i < dim; i++)
01005 c->elts[i] = a.elts[i] + b.elts[i];
01006
01007 #ifdef ENABLE_FLOPS
01008 flops += dim ;
01009 #endif
01010 }
|
|
||||||||||||
|
Create vector v by allocating memory and initializing values. Definition at line 852 of file matrix.c. References calloc, vector::dim, vector::elts, i, matrix_error(), v, and vector_destroy(). Referenced by calc_covariance(), calc_tcoef(), calculate_results(), cubic_spline(), do_xrestore_stuff(), glt_analysis(), initialize_state_history(), poly_field(), and regression_analysis().
00853 {
00854 register int i;
00855
00856 vector_destroy (v);
00857
00858 if (dim < 0) matrix_error ("Illegal dimensions for new vector");
00859
00860 v->dim = dim;
00861 if (dim < 1) return;
00862
00863 v->elts = (double *) calloc (sizeof(double) , dim);
00864 if (v->elts == NULL)
00865 matrix_error ("Memory allocation error");
00866
00867 }
|
|
|
Destroy vector data structure by deallocating memory. Definition at line 840 of file matrix.c. References vector::elts, free, v, and vector_initialize(). Referenced by calc_covariance(), calc_linear_regression(), calc_reduced_model(), calc_resids(), calc_response(), calc_sse(), calc_sse_fit(), calculate_results(), cubic_spline(), DWItoDT_tsfunc(), form_clusters(), FreeGlobals(), glt_analysis(), init_delay(), init_regression_analysis(), poly_field(), print_cluster(), regression_analysis(), reset_options(), terminate_program(), vector_create(), and vector_create_noinit().
00841 {
00842 if (v->elts != NULL) free (v->elts);
00843 vector_initialize (v);
00844 }
|
|
||||||||||||
|
Calculate dot product of vector a with vector b. Definition at line 1220 of file matrix.c. References a, vector::dim, vector::elts, flops, i, and matrix_error(). Referenced by calc_linear_regression(), calc_resids(), and calc_sse().
01221 {
01222 register int i, dim;
01223 register double sum;
01224 register double *aa , *bb ;
01225
01226 if (a.dim != b.dim)
01227 matrix_error ("Incompatible dimensions for vector dot product");
01228
01229 dim = a.dim;
01230
01231 sum = 0.0;
01232 aa = a.elts ; bb = b.elts ;
01233 for (i = 0; i < dim; i++)
01234 #if 0
01235 sum += a.elts[i] * b.elts[i];
01236 #else
01237 sum += aa[i] * bb[i] ;
01238 #endif
01239
01240 #ifdef ENABLE_FLOPS
01241 flops += 2.0*dim ;
01242 #endif
01243 return (sum);
01244 }
|
|
|
Calculate dot product of vector a with itself -- 28 Dec 2001, RWCox. Definition at line 1251 of file matrix.c. References a, vector::dim, vector::elts, flops, and i. Referenced by calc_sse_fit().
01252 {
01253 register int i, dim;
01254 register double sum;
01255 register double *aa ;
01256
01257 dim = a.dim;
01258 sum = 0.0;
01259 aa = a.elts ;
01260 for (i = 0; i < dim; i++)
01261 #if 0
01262 sum += a.elts[i] * a.elts[i];
01263 #else
01264 sum += aa[i] * aa[i] ;
01265 #endif
01266
01267 #ifdef ENABLE_FLOPS
01268 flops += 2.0*dim ;
01269 #endif
01270 return (sum);
01271 }
|
|
||||||||||||
|
Copy vector a. Result is vector b. Definition at line 920 of file matrix.c. References a, vector::dim, vector::elts, i, and vector_create_noinit(). Referenced by regression_analysis().
00921 {
00922 register int i, dim;
00923
00924 dim = a.dim;
00925
00926 vector_create_noinit (dim, b);
00927
00928 #if 0
00929 for (i = 0; i < dim; i++)
00930 b->elts[i] = a.elts[i];
00931 #else
00932 if( dim > 0 )
00933 memcpy( b->elts , a.elts , sizeof(double)*dim ) ; /* RWCox */
00934 #endif
00935 }
|
|
|
Initialize vector data structure. Definition at line 828 of file matrix.c. References vector::dim, vector::elts, and v. Referenced by calc_covariance(), calc_linear_regression(), calc_reduced_model(), calc_resids(), calc_response(), calc_sse(), calc_sse_fit(), calculate_results(), cubic_spline(), do_xrestore_stuff(), DWItoDT_tsfunc(), form_clusters(), glt_analysis(), init_delay(), init_regression_analysis(), InitGlobals(), initialize_options(), initialize_state_history(), poly_field(), print_cluster(), regression_analysis(), and vector_destroy().
|
|
||||||||||||||||
|
Right multiply matrix a by vector b. Result is vector c. Definition at line 1051 of file matrix.c. References a, c, matrix::cols, cols, vector::dim, dotnum, dotsum, matrix::elts, vector::elts, flops, i, matrix_error(), MATVEC, matrix::rows, rows, and vector_create_noinit(). Referenced by calc_coef(), calc_lcoef(), calc_linear_regression(), calc_rcoef(), calc_resids(), calc_response(), calc_sse(), calc_sse_fit(), cubic_spline(), do_xrestore_stuff(), DWItoDT_tsfunc(), form_clusters(), poly_field(), and print_cluster().
01052 {
01053 register int rows, cols;
01054 register int i, j;
01055 register double *bb ;
01056 register double sum ;
01057 #ifdef DOTP
01058 register double **aa , *cc ;
01059 #else
01060 register double *aa ;
01061 #endif
01062
01063
01064 if (a.cols != b.dim){
01065 char str[444] ;
01066 sprintf(str,
01067 "Incompatible dimensions for vector multiplication: %dx%d X %d",
01068 a.rows,a.cols,b.dim ) ;
01069 matrix_error(str) ;
01070 }
01071
01072 rows = a.rows;
01073 cols = a.cols;
01074
01075 vector_create_noinit (rows, c);
01076
01077 if( cols <= 0 ){
01078 for( i=0 ; i < rows ; i++ ) c->elts[i] = 0.0 ;
01079 return ;
01080 }
01081
01082 bb = b.elts ;
01083
01084 #ifdef MATVEC
01085 MATVEC( a , b , *c ) ; /* 04 Mar 2005 */
01086
01087 #elif defined(DOTP) /* vectorized */
01088 aa = a.elts ; cc = c->elts ;
01089 i = rows%2 ;
01090 if( i == 1 ) DOTP(cols,aa[0],bb,cc) ;
01091 for( ; i < rows ; i+=2 ){
01092 DOTP(cols,aa[i] ,bb,cc+i ) ;
01093 DOTP(cols,aa[i+1],bb,cc+(i+1)) ;
01094 }
01095 #else
01096
01097 #ifdef UNROLL_VECMUL
01098 if( cols%2 == 0 ){ /* even number of cols */
01099 for (i = 0; i < rows; i++){
01100 sum = 0.0 ; aa = a.elts[i] ;
01101 for (j = 0; j < cols; j+=2 )
01102 sum += aa[j]*bb[j] + aa[j+1]*bb[j+1];
01103 c->elts[i] = sum ;
01104 }
01105 } else { /* odd number of cols */
01106 for (i = 0; i < rows; i++){
01107 aa = a.elts[i] ; sum = aa[0]*bb[0] ;
01108 for (j = 1; j < cols; j+=2 )
01109 sum += aa[j]*bb[j] + aa[j+1]*bb[j+1];
01110 c->elts[i] = sum ;
01111 }
01112 }
01113 #else
01114 for (i = 0; i < rows; i++){
01115 sum = 0.0 ; aa = a.elts[i] ;
01116 for (j = 0; j < cols; j++ ) sum += aa[j]*bb[j] ;
01117 c->elts[i] = sum ;
01118 }
01119 #endif /* UNROLL_VECMUL */
01120
01121 #endif /* MATVEC, DOTP */
01122
01123 #ifdef ENABLE_FLOPS
01124 flops += 2.0*rows*cols ;
01125 dotsum += rows*cols ; dotnum += rows ;
01126 #endif
01127 return ;
01128 }
|
|
||||||||||||||||||||
|
Compute d = c-a*b: a is a matrix; b,c,d are vectors -- RWCox 26 Feb 2002: return value is sum of squares of d vector Definition at line 1136 of file matrix.c. References a, c, matrix::cols, cols, vector::dim, dotnum, dotsum, matrix::elts, vector::elts, flops, free, i, malloc, matrix_error(), matrix::rows, rows, and vector_create_noinit(). Referenced by calc_resids(), and calc_sse().
01137 {
01138 register int rows, cols;
01139 register int i, j;
01140 register double *bb ;
01141 #ifdef DOTP
01142 double qsum,sum , **aa , *dd,*cc,*ee ;
01143 #else
01144 register double qsum,sum, *aa ;
01145 #endif
01146
01147
01148 if (a.cols != b.dim || a.rows != c.dim )
01149 matrix_error ("Incompatible dimensions for vector multiplication-subtraction");
01150
01151 rows = a.rows;
01152 cols = a.cols;
01153
01154 vector_create_noinit (rows, d);
01155
01156 if( cols <= 0 ){
01157 qsum = 0.0 ;
01158 for( i=0 ; i < rows ; i++ ){
01159 d->elts[i] = c.elts[i] ;
01160 qsum += d->elts[i] * d->elts[i] ;
01161 }
01162 return qsum ;
01163 }
01164
01165 qsum = 0.0 ; bb = b.elts ;
01166
01167 #ifdef DOTP /* vectorized */
01168 aa = a.elts ; dd = d->elts ; cc = c.elts ;
01169 ee = (double *)malloc(sizeof(double)*rows) ;
01170 i = rows%2 ;
01171 if( i == 1 ) DOTP(cols,aa[0],bb,ee) ;
01172 for( ; i < rows ; i+=2 ){
01173 DOTP(cols,aa[i] ,bb,ee+i ) ;
01174 DOTP(cols,aa[i+1],bb,ee+(i+1)) ;
01175 }
01176 VSUB(rows,cc,ee,dd) ;
01177 DOTP(rows,dd,dd,&qsum) ;
01178 free((void *)ee) ;
01179 #else
01180
01181 #ifdef UNROLL_VECMUL
01182 if( cols%2 == 0 ){ /* even number */
01183 for (i = 0; i < rows; i++){
01184 aa = a.elts[i] ; sum = c.elts[i] ;
01185 for (j = 0; j < cols; j+=2)
01186 sum -= aa[j]*bb[j] + aa[j+1]*bb[j+1];
01187 d->elts[i] = sum ; qsum += sum*sum ;
01188 }
01189 } else { /* odd number */
01190 for (i = 0; i < rows; i++){
01191 aa = a.elts[i] ; sum = c.elts[i] - aa[0]*bb[0] ;
01192 for (j = 1; j < cols; j+=2)
01193 sum -= aa[j]*bb[j] + aa[j+1]*bb[j+1];
01194 d->elts[i] = sum ; qsum += sum*sum ;
01195 }
01196 }
01197 #else
01198 for (i = 0; i < rows; i++){
01199 aa = a.elts[i] ; sum = c.elts[i] ;
01200 for (j = 0; j < cols; j++) sum -= aa[j] * bb[j] ;
01201 d->elts[i] = sum ; qsum += sum*sum ;
01202 }
01203 #endif /* UNROLL_VECMUL */
01204
01205 #endif /* DOTP */
01206
01207 #ifdef ENABLE_FLOPS
01208 flops += 2.0*rows*(cols+1) ;
01209 dotsum += rows*cols ; dotnum += rows ;
01210 #endif
01211
01212 return qsum ; /* 26 Feb 2003 */
01213 }
|
|
|
Print contents of vector v. Definition at line 891 of file matrix.c. References vector::dim, vector::elts, i, and v. Referenced by print_cluster(), and vector_sprint().
|
|
||||||||||||
|
Print label and contents of vector v. Definition at line 907 of file matrix.c. References v, and vector_print(). Referenced by calc_covariance().
00908 {
00909 printf ("%s \n", s);
00910
00911 vector_print (v);
00912 }
|
|
||||||||||||||||
|
Subtract vector b from vector a. Result is vector c. Definition at line 1018 of file matrix.c. References a, c, vector::dim, vector::elts, flops, i, matrix_error(), and vector_create_noinit(). Referenced by calc_linear_regression(), calc_resids(), calc_sse(), and calc_sse_fit().
01019 {
01020 register int i, dim;
01021 register double *aa,*bb,*cc ;
01022
01023 if (a.dim != b.dim)
01024 matrix_error ("Incompatible dimensions for vector subtraction");
01025
01026 dim = a.dim;
01027
01028 vector_create_noinit (dim, c);
01029
01030 aa = a.elts ; bb = b.elts ; cc = c->elts ;
01031 for (i = 0; i < dim; i++)
01032 #if 0
01033 c->elts[i] = a.elts[i] - b.elts[i];
01034 #else
01035 cc[i] = aa[i] - bb[i] ;
01036 #endif
01037
01038 #ifdef ENABLE_FLOPS
01039 flops += dim ;
01040 #endif
01041 }
|
|
||||||||||||
|
Convert vector v into array f. Definition at line 979 of file matrix.c. References vector::dim, vector::elts, i, and v. Referenced by calc_reduced_model(), calculate_results(), DWItoDT_tsfunc(), and form_clusters().
|