source: TRACY3/trunk/tracy/tools/nrutil.c @ 32

Last change on this file since 32 was 3, checked in by zhangj, 12 years ago

Initiale import

  • Property svn:executable set to *
File size: 18.7 KB
Line 
1/* nrutil.c ***************************************************************
2
3  NR Library Package - Utilities Module
4
5  James Trevelyan,  University of Western Australia
6  Revision 2   January 1996
7
8**************************************************************************/
9
10#include <stdio.h>
11#include <math.h>
12#include <stdlib.h>
13#include <string.h>
14#include "nrlin.h"
15
16/* define V_CHECK for validity checks on matrices to be included */
17#define V_CHECK
18/* define this if you want to use the test program below */
19#undef TEST
20
21
22void dmmult( double **a, int a_rows, int a_cols, 
23             double **b, int b_rows, int b_cols, double **y)
24/* multiply two matrices a, b, result in y. y must not be same as a or b */
25{
26   int i, j, k;
27   double sum;
28
29   if ( a_cols != b_rows ) {
30      fprintf(stderr,"a_cols <> b_rows (%d,%d): dmmult\n", a_cols, b_rows);
31      exit(1);
32   }
33
34#ifdef V_CHECK
35   if ( !valid_dmatrix_b( a ) ) 
36      nrerror("Invalid 1st matrix: dmmult\n");   
37   if ( !valid_dmatrix_b( b ) ) 
38      nrerror("Invalid 2nd matrix: dmmult\n");   
39   if ( !valid_dmatrix_b( y ) ) 
40      nrerror("Invalid result matrix: dmmult\n"); 
41#endif
42
43   /*  getchar();
44       dmdump( stdout, "Matrix a", a, a_rows, a_cols, "%8.2lf");
45       dmdump( stdout, "Matrix b", b, b_rows, b_cols, "%8.2lf");
46       getchar();
47   */
48   for ( i=1; i<=a_rows; i++ ) 
49      for ( j=1; j<=b_cols; j++ ) {
50         sum = 0.0;
51         for ( k=1; k<=a_cols; k++ ) sum += a[i][k]*b[k][j];
52         y[i][j] = sum;
53      }
54}
55
56void dmvmult( double **a, int a_rows, int a_cols, double *b, int b_els, double *y)
57/* multiply a matrix a by vector b, result in y. y can be same as b */
58{
59   int i, k;
60   double sum;
61
62#ifdef V_CHECK
63   if ( !valid_dmatrix_b( a ) ) 
64      nrerror("Invalid matrix: dmvmult\n");   
65   if ( !valid_dvector_b( b ) ) 
66      nrerror("Null pointer to vector: dmvmult");
67#endif
68
69   for ( i=1; i<=a_rows; i++ ) {
70      sum = 0.0;
71      for ( k=1; k<=a_cols; k++ ) sum += a[i][k]*b[k];
72      y[i] = sum;
73   }
74}
75
76/****************************************************************************/
77/* void dmadd( double **a, int a_rows, int a_cols, double **b, double **y)
78
79   Purpose:
80       add two matrices a, b, result in y. y can be same as a or b
81       
82   
83****************************************************************************/
84void dmadd( double **a, int a_rows, int a_cols, double **b, double **y)
85{
86   int i, j;
87
88#ifdef V_CHECK
89   if ( !valid_dmatrix_b( a ) ) 
90      nrerror("Invalid 1st matrix: dmadd\n"); 
91   if ( !valid_dmatrix_b( b ) ) 
92      nrerror("Invalid 2nd matrix: dmadd\n"); 
93   if ( !valid_dmatrix_b( y ) ) 
94      nrerror("Invalid result matrix: dmadd\n"); 
95#endif
96
97   for ( i=1; i<=a_rows; i++ ) 
98      for ( j=1; j<=a_cols; j++ ) {
99         y[i][j] = a[i][j] + b[i][j];
100      }
101}
102
103/****************************************************************************/
104/* void dmsmy( double **a, int a_rows, int a_cols, double r, double **y)
105
106   Purpose:
107       multiply a by scalar r, result in y. y can be same as a
108       
109   
110****************************************************************************/
111void dmsmy( double **a, int a_rows, int a_cols, double r, double **y)
112{
113   int i, j;
114
115#ifdef V_CHECK
116   if ( !valid_dmatrix_b( a ) ) 
117      nrerror("Invalid 1st matrix: dmsmy\n"); 
118   if ( !valid_dmatrix_b( y ) ) 
119      nrerror("Invalid result matrix: dmsmy\n"); 
120#endif
121
122   for ( i=1; i<=a_rows; i++ ) 
123      for ( j=1; j<=a_cols; j++ ) {
124         y[i][j] = a[i][j] * r;
125      }
126}
127
128/****************************************************************************/
129/* void dmsub( double **a, int a_rows, int a_cols, double **b, double **y)
130
131   Purpose:
132       subtract two matrices a, b, result in y. y can be same as a or b
133       
134   
135****************************************************************************/
136void dmsub( double **a, int a_rows, int a_cols, double **b, double **y)
137{
138   int i, j;
139
140#ifdef V_CHECK
141   if ( !valid_dmatrix_b( a ) ) 
142      nrerror("Invalid 1st matrix: dmsub\n"); 
143   if ( !valid_dmatrix_b( b ) ) 
144      nrerror("Invalid 2nd matrix: dmsub\n"); 
145   if ( !valid_dmatrix_b( y ) ) 
146      nrerror("Invalid result matrix: dmsub\n"); 
147#endif
148
149   for ( i=1; i<=a_rows; i++ ) 
150      for ( j=1; j<=a_cols; j++ ) {
151         y[i][j] = a[i][j] - b[i][j];
152      }
153}
154
155void dmtranspose( double **a, int a_rows, int a_cols, double **y)
156/* transpose matrix a, result in y. y must not be same as a */
157{
158   int i, j;
159
160#ifdef V_CHECK
161   if ( !valid_dmatrix_b( a ) ) 
162      nrerror("Invalid 1st matrix: dmtranspose\n");   
163   if ( !valid_dmatrix_b( y ) ) 
164      nrerror("Invalid result matrix: dmtranspose\n");   
165#endif
166
167   for ( i=1; i<=a_rows; i++ ) 
168      for ( j=1; j<=a_cols; j++ ) {
169         y[j][i] = a[i][j];
170      }
171}
172
173void dmfillUT( double **a, int a_rows, int a_cols)
174/* fill upper half of a (square) (lower triangular form) to make a symmetric
175   if not square, will do the best possible */
176{
177   int i, j;
178
179#ifdef V_CHECK
180   if ( !valid_dmatrix_b( a ) ) 
181      nrerror("Invalid 1st matrix: dmfillUT\n"); 
182#endif
183
184   for ( i=1; i<=a_rows; i++ ) 
185      for ( j=i; j<=a_cols; j++ ) {
186         a[j][i] = a[i][j];
187      }
188}
189
190
191
192
193void dmdump( FILE *outf, char *text, double **a, int a_rows, int a_cols, char *format)
194{
195   int i, j, k;
196
197#ifdef V_CHECK
198   if ( !valid_dmatrix_b( a ) ) 
199      nrerror("Invalid matrix: dmdump\n");   
200#endif
201
202   fprintf( outf, "%s", text);
203   for ( i=1; i<=a_rows; i++ ) {
204      fprintf( outf, "\n  [%d][1]:", i);
205      k=0;
206      for ( j=1; j<=a_cols; j++ ) {
207         fprintf( outf, format, a[i][j]);
208         k = (k+1)%6;
209         if ( (k == 0) && (j<a_cols) )fprintf(outf, "\n          ");
210      }
211   }
212   fprintf( outf, "\n");
213}   
214
215void dWriteMatrix( FILE *outf, char *text, double **a, int a_rows, int a_cols, char *format)
216{
217   int i, j;
218
219#ifdef V_CHECK
220   if ( !valid_dmatrix_b( a ) ) 
221      nrerror("Invalid matrix: dmdump\n");   
222#endif
223   fprintf( outf, "* %s", text);
224   fprintf( outf, "\nM %d %d", a_rows, a_cols );
225   for ( i=1; i<=a_rows; i++ ) {
226      fprintf( outf, "\n");
227      for ( j=1; j<=a_cols; j++ ) {
228         fprintf( outf, format, a[i][j]);
229      }
230   }
231   fprintf( outf, "\n");
232}
233
234void dvdump( FILE *outf, char *text, double *a, int a_els, char *format)
235{
236   int j, k;
237
238   if ( !valid_dvector_b( a ) ) {
239      fprintf( stderr, "%s: Invalid pointer to vector\n", text);
240      return;
241   }
242   fprintf( outf, "%s\n", text);
243   k = 0;
244   for ( j=1; j<=a_els; j++ ) {
245      fprintf( outf, format, a[j]);
246      k = (k+1)%6;
247      if ( k == 0 )fprintf( outf, "\n");
248   }
249   fprintf( outf, "\n");
250}   
251
252void dWriteVector( FILE *outf, char *text, double *a, int a_els, char *format)
253{
254   int j;
255
256   if ( !valid_dvector_b( a ) ) {
257      fprintf( stderr, "%s: Invalid pointer to vector\n", text);
258      return;
259   }
260   fprintf( outf, "* %s\n", text);
261   fprintf( outf, "V %d\n", a_els);
262   for ( j=1; j<=a_els; j++ ) {
263      fprintf( outf, format, a[j]);
264   }
265   fprintf( outf, "\n");
266}
267
268void dWriteScalar( FILE *outf, char *text, double a, char *format)
269{
270   int j, k;
271
272   fprintf( outf, "* %s\n", text);
273   fprintf( outf, "S ");
274   fprintf( outf, format, a);
275   fprintf( outf, "\n");
276}
277
278void dvadd( double *a, int a_els, double *b, double *y)
279{
280   int j;
281
282#ifdef V_CHECK
283   if ( !valid_dvector_b( a ) ) 
284      nrerror("Null pointer to 1st vector: dvadd");
285   if ( !valid_dvector_b( b ) ) 
286      nrerror("Null pointer to 2nd vector: dvadd");
287   if ( !valid_dvector_b( y ) ) 
288      nrerror("Null pointer to result vector: dvadd");
289#endif
290   for ( j=1; j<=a_els; j++ ) {
291      y[j] = a[j] + b[j];
292   }
293}   
294
295void dvsub( double *a, int a_els, double *b, double *y)
296{
297   int j;
298
299#ifdef V_CHECK
300   if ( !valid_dvector_b( a ) ) 
301      nrerror("Null pointer to 1st vector: dvsub");
302   if ( !valid_dvector_b( b ) ) 
303      nrerror("Null pointer to 2nd vector: dvsub");
304   if ( !valid_dvector_b( y ) ) 
305      nrerror("Null pointer to result vector: dvsub");
306#endif
307
308   for ( j=1; j<=a_els; j++ ) {
309      y[j] = a[j] - b[j];
310   }
311}   
312
313double dvdot( double *a, int a_els, double *b)
314{
315   int j;
316   double y;
317
318#ifdef V_CHECK
319   if ( !valid_dvector_b( a ) ) 
320      nrerror("Null pointer to 1st vector: dvdot");
321   if ( !valid_dvector_b( b ) ) 
322      nrerror("Null pointer to 2nd vector: dvdot");
323#endif
324
325   y = 0.0;
326   for ( j=1; j<=a_els; j++ ) {
327      y += a[j] * b[j];
328   }
329   return(y);
330}   
331
332#define TINY 1.0E-20
333double dvmag( double *a, int a_els)
334{
335   int j;
336   double y;
337
338#ifdef V_CHECK
339   if ( !valid_dvector_b( a ) ) 
340      nrerror("Null pointer to vector: dvmag");
341#endif
342
343   y = 0.0;
344   for ( j=1; j<=a_els; j++ ) {
345      y += a[j] * a[j];
346   }
347   if ( y > TINY ) y = sqrt( y );
348   return(y);
349}   
350
351double dvmnorm( double *a, int a_els)
352{
353   int j;
354   double y;
355
356#ifdef V_CHECK
357   if ( !valid_dvector_b( a ) ) 
358      nrerror("Null pointer to vector: dvmnorm");
359#endif
360
361   y = 0.0;
362   for ( j=1; j<=a_els; j++ ) {
363      y += a[j] * a[j];
364   }
365   if ( y > TINY ) {
366      y = sqrt( y );
367      for ( j=1; j<=a_els; j++ ) {
368         a[j] = a[j]/y;
369      }   
370   }
371   return(y);
372}   
373#undef TINY
374
375void dvsmy( double *a, int a_els, double r, double *y)
376{
377   int j;
378
379#ifdef V_CHECK
380   if ( !valid_dvector_b( a ) ) 
381      nrerror("Null pointer to 1st vector: dvsmy");
382   if ( !valid_dvector_b( y ) ) 
383      nrerror("Null pointer to result vector: dvsmy");
384#endif
385
386   for ( j=1; j<=a_els; j++ ) {
387      y[j] = a[j] * r;
388   }
389}   
390
391void dvpiv( double *a, int a_els, double r, double *b, double *y)
392{
393   int j;
394
395#ifdef V_CHECK
396   if ( !valid_dvector_b( a ) ) 
397      nrerror("Null pointer to 1st vector: dvpiv");
398   if ( !valid_dvector_b( b ) ) 
399      nrerror("Null pointer to 2nd vector: dvpiv");
400   if ( !valid_dvector_b( y ) ) 
401      nrerror("Null pointer to result vector: dvpiv");
402#endif
403
404   for ( j=1; j<=a_els; j++ ) {
405      y[j] = a[j] * r + b[j];
406   }
407}   
408
409/*--------------------------------------------------------------------
410  Function for reading in a matrix or vector from a data file
411  Format:
412  Line 1:      M   nrow  {ncol}
413  Line 2:      ncol real values
414  ..
415  ..
416  Line 1+nrow: ncol real values
417
418*/
419#define BUF 1000
420
421
422void dReadMatrix(FILE *datafile, double **y, int *rows, int *cols, int *error)
423/* read a matrix (NR type) */
424{
425   char    line[BUF+2], *token;
426   int     i, j, row, col, nrow, ncol, found, completed;
427   double  r;
428   char *fgr;
429
430   *error = 0;
431   nrow = 0;
432   ncol = 0;
433   completed = 0;
434   found = 0;
435
436#ifdef V_CHECK
437   if ( !valid_dmatrix_b( y ) ) 
438      nrerror("Invalid matrix: dReadMatrix\n");   
439#endif
440
441   if (datafile == NULL) {
442      fprintf(stderr,"ReadMatrix: data file not open\n");
443      *error = 1;
444      return;
445   }
446   row = 1;
447   while ((fgr = fgets(line, BUF, datafile)) != NULL && !found) {
448      if ( strncmp(line, "M", 1) == 0) {
449         found = 1;                 
450      }
451      if ( found ) {
452         /*          fprintf(stderr,"ReadMatrix: %s",line); */
453                        token = strtok(line, " ,\t\n");
454                        token = strtok(NULL, " ,\t\n"); /* skip the 'M' */
455                        if (token != NULL) {
456                                nrow = atoi(token);
457                                token = strtok(NULL, " ,\t\n");
458                                if (token != NULL) {
459                                        ncol = atoi(token);
460                                }
461                                else {
462                                        ncol = 1;                 /* presume column matrix */
463                                }
464                        }
465                        else {
466                                fprintf(stderr,"ReadMatrix: Could not read *rows* in data");
467                                *error = 2;
468                        }
469                }
470
471        }
472        if ( !found ) {
473                fprintf(stderr,"ReadMatrix: M for matrix not found!\n");
474                *error = 3;
475                exit(1);
476        }
477
478        while (fgr != NULL && !completed) {
479                if (strlen(line) == 0 ||
480                        strncmp(line, "*", 1) == 0 ||
481                        strncmp(line, "\n", 1) == 0) {
482                        ;    /* Blank line or comment */
483                }
484                else { /* read in the data */
485
486                        if (row <= nrow && *error == 0) {
487                                token = strtok(line, " ,\t\n");
488                                i = 1;
489                                while (token != NULL && i <= ncol) {
490                                        sscanf(token, "%lf", &r);
491                                        y[row][i] = r;
492                                        /* printf("%s=y[%d][%d]: %lf\n",token,row,i,r);  */
493                                        token = strtok(NULL, " ,\t\n");
494                                        i++;
495                                }
496                                /* getchar(); */
497                                if ( row == nrow )  {
498                                        *rows = nrow;
499                                        *cols = ncol;
500                                        return;
501                                }
502                                row++;
503                        }
504                }     /* not a comment */
505                fgr = fgets(line, BUF, datafile);
506        }       /* while not EOF */
507        if ( !completed ) {
508                fprintf(stderr,"ReadMatrix: more data expected!\n");
509                *error = 4;
510                return;
511        }
512}
513
514/*--------------------------------------------------------------------
515  Function for reading in a vector from a data file
516  Format:
517  Line 1:      V   nels
518  Line 2:      nels real values
519*/
520void dReadVector(FILE *datafile, double *y, int *els, int *error)
521/* read a vector (NR type) */
522{
523        char    line[BUF+2], *token;
524        int     i, j, nels, completed, found;
525        double  r;
526        char *fgr;
527
528        *error = 0;
529        nels = 0;
530        completed = 0;
531        found = 0;
532
533        if (datafile == NULL) {
534                fprintf(stderr,"ReadVector: data file not open\n");
535                *error = 1;
536                return;
537        }
538        while ((fgr = fgets(line, BUF, datafile)) != NULL && !found) {
539                if ( strncmp(line, "V", 1) == 0) {
540                        found = 1;
541                }
542                if ( found ) {
543                        /*          fprintf(stderr,"ReadVector:%s",line); */
544                        token = strtok(line, " ,\t\n");
545                        token = strtok(NULL, " ,\t\n"); /* skip the 'V' */
546                        if (token != NULL) {
547                                nels = atoi(token);
548                        }
549                        else {
550                                fprintf(stderr,"ReadVector: Could not read *nels* in data");
551                                *error = 2;
552                                exit(1);
553                        }
554                }
555        }
556        if ( !found ) {
557                fprintf(stderr,"ReadVector: V for Vector not found!\n");
558                *error = 3;
559                exit(1);
560        }
561
562        while (fgr != NULL && !completed) {
563
564                if (strlen(line) == 0 ||
565                        strncmp(line, "*", 1) == 0 ||
566                        strncmp(line, "\n", 1) == 0) {
567                        ;    /* Blank line or comment */
568                }
569                else { /* read in the data */
570                        if (*error == 0) {
571                                token = strtok(line, " ,\t\n");
572                                i = 1;
573                                while (token != NULL && i <= nels) {
574                                        sscanf(token, "%lf", &r);
575                                        y[i] = r;
576                                        /* printf("%s=y[%d]: %lf\n",token,i,r); */
577                                        token = strtok(NULL, " ,\t\n");
578                                        i++;
579                                }
580                                if ( i > nels ) {
581                                        *els = nels;
582                                        return;
583                                }
584                                /* getchar(); */
585                        }
586                }      /* not a comment */
587                fgr = fgets(line, BUF, datafile);
588        }        /* while not EOF */
589        if ( !completed ) {
590                fprintf(stderr,"ReadVector: more data expected!\n");
591                *error = 5;
592                return;
593        }
594}
595
596/*--------------------------------------------------------------------
597  Function for reading in a scalar from a data file
598  Format:
599  Line 1:      S   value
600*/
601double dReadScalar(FILE *datafile, int *error)
602{
603        char    line[BUF+2], *token;
604        int     i, found;
605        double  r;
606
607        *error = 0;
608        found = 0;
609
610        if (datafile == NULL) {
611                fprintf(stderr,"ReadScalar: data file not open\n");
612                *error = -1;
613                return(0.0);
614        }
615        while (fgets(line, BUF, datafile) != NULL && !found) {
616                if ( strncmp(line, "S", 1) == 0) {
617                        found = 1;
618                }
619                if ( found ) {
620                        /*          fprintf(stderr,"ReadScalar: %s",line); */
621                        token = strtok(line, " ,\t\n");
622                        token = strtok(NULL, " ,\t\n"); /* skip the 'S' */
623                        if (token != NULL) {
624                                r = atof(token);
625                        }
626                        else {
627                                fprintf(stderr,"ReadScalar: Could not read scalar in data");
628                                *error = -2;
629                                exit(1);
630                        }
631                }
632        }
633        if ( !found ) {
634                fprintf(stderr,"ReadVector: S for Scalar not found!\n");
635                *error = 10;
636                exit(1);
637        }
638        return(r);
639}
640
641
642/****************************************************************************/
643/* void identity_mat(const int n, double** A)
644
645   Purpose:
646           copy  matrix a to matrix b
647       
648   
649****************************************************************************/
650void dmcopy( double **a, int a_rows, int a_cols, double **b) 
651{
652        int i, j;
653
654#ifdef V_CHECK
655        if ( !valid_dmatrix_b( a ) )
656                nrerror("Invalid matrix: dmcopy\n");
657        if ( !valid_dmatrix_b( b ) )
658      nrerror("Invalid destination matrix: dmcopy\n");   
659#endif
660
661   for ( i=1; i<=a_rows; i++ )
662      for ( j=1; j<=a_cols; j++ ) b[i][j] = a[i][j];
663}
664
665void dvcopy( double *a, int a_els, double *y) /* copy a vector */
666{
667   int i;
668
669#ifdef V_CHECK
670   if ( !valid_dvector_b( a ) ) 
671      nrerror("Null pointer to 1st vector: dvcopy");
672   if ( !valid_dvector_b( y ) ) 
673      nrerror("Null pointer to 2nd vector: dvcopy");
674#endif 
675
676   for ( i=1; i<=a_els; i++ ) y[i] = a[i];
677}
678
679double dvcomp( double *a, int a_els, double *b) /* compare two vectors */
680{
681   int i;
682   double ma, mb, da, sa, ra;
683
684#ifdef V_CHECK
685   if ( !valid_dvector_b( a ) ) 
686      nrerror("Null pointer to 1st vector: dvcomp");
687   if ( !valid_dvector_b( b ) ) 
688      nrerror("Null pointer to 2nd vector: dvcomp");
689#endif 
690
691   ma = dvmag( a, a_els );
692   mb = dvmag( b, a_els );
693   da = 0.0;
694   for (i=1; i<=a_els; i++) da += DSQR(a[i] - b[i]);   
695   sa = sqrt( ma*mb );
696   da = sqrt( da );
697   if ( ma > mb ) ra = 1.0 - mb/ma;
698   else ra = 1.0 - ma/mb;
699   /*  printf("Mag rat %lf ", ra); */
700   if ((da = da/sa) > ra ) ra = da;
701   /*  printf("diff %lf ", da); */
702   return(ra);
703}
704
705void dgetcolumn(double **G, int col, double *v, int nels) /* get a column from a matrix */
706{
707   int i;
708
709#ifdef V_CHECK
710   if ( !valid_dmatrix_b( G ) ) 
711      nrerror("Invalid matrix: dgetcolumn\n");   
712   if ( !valid_dvector_b( v ) ) 
713      nrerror("Null pointer to vector: dgetcolumn");
714#endif
715
716   for ( i=1; i<=nels; i++ ) v[i] = G[i][col];
717}
718
719void dputcolumn(double *v, int nels, double **G, int col) /* put a column into a matrix */
720{
721   int i;
722
723#ifdef V_CHECK
724   if ( !valid_dmatrix_b( G ) ) 
725      nrerror("Invalid matrix: dputcolumn\n");   
726   if ( !valid_dvector_b( v ) ) 
727      nrerror("Null pointer to vector: dputcolumn");
728#endif
729
730   for ( i=1; i<=nels; i++ ) G[i][col] = v[i];
731}
732
733
734
735#ifdef TEST
736main()
737{
738   /* test program for above utility routines */
739
740   double **a, **b, **c, **bT;
741   double *x, *y, *z;
742   FILE *infile, *outfile;
743   int a_rows, a_cols, b_rows, b_cols, errors, xn, yn;
744
745   infile = fopen("mat.in", "r");
746   outfile = fopen("mat.dat", "w");
747
748   a = dReadMatrix( infile, &a_rows, &a_cols, &errors);
749   b = dReadMatrix( infile, &b_rows, &b_cols, &errors);
750   x = dReadVector( infile, &xn, &errors);
751   y = dReadVector( infile, &yn, &errors);
752   getchar();
753
754   dmdump( stdout, "Matrix A", a, a_rows, a_cols, "%8.2lf");
755   dmdump( stdout, "Matrix B", b, b_rows, b_cols, "%8.2lf");
756   dvdump( stdout, "Vector x", x, xn, "%8.2lf");
757   dvdump( stdout, "Vector y", y, yn, "%8.2lf");
758   z = dvector( 1, xn );
759   dvadd( x, xn, y, z );
760   dvdump( stdout, "x + y", z, xn, "%8.2lf");
761   dvsub( x, xn, y, z );
762   dvdump( stdout, "x - y", z, xn, "%8.2lf");
763   dvsmy( x, xn, 2.0, z );
764   dvdump( stdout, "2x", z, xn, "%8.2lf");
765   printf("Magnitude of 2x: %7.2lf\n", dvmag( z, xn ));
766   printf("dot product x.y: %7.2lf\n", dvdot( x, xn, y));
767
768   dmvmult( a, a_rows, a_cols, x, xn, z );
769   dvdump( stdout, "Ax", z, xn, "%8.2lf");
770
771   c = dmatrix( 1, a_rows, 1, b_cols );   
772   bT = dmatrix( 1, b_cols, 1, b_rows );
773   dmtranspose( b, b_rows, b_cols, bT);
774   dmdump( stdout, "Matrix B (transposed)", bT, b_cols, b_rows, "%8.2lf");
775   dmmult( a, a_rows, a_cols, bT, b_cols, b_rows, c);
776   dmdump( stdout, "Matrix AB", c, a_rows, b_rows, "%8.2lf");
777
778   /*  dmfillUT( a, a_rows, a_cols );
779       dmdump( stdout, "Symmetrified matrix A", a, a_rows, a_cols, "%8.2lf"); */
780
781   free_dmatrix( a, 1, a_rows, 1, a_cols);
782   free_dmatrix( b, 1, b_rows, 1, b_cols);
783   free_dmatrix( c, 1, a_rows, 1, b_cols);
784   free_dvector( x, 1, xn );
785   free_dvector( y, 1, yn );
786}
787#endif
Note: See TracBrowser for help on using the repository browser.