home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / mesch12a.zip / zmatrix.h < prev    next >
C/C++ Source or Header  |  1994-01-13  |  9KB  |  279 lines

  1.  
  2. /**************************************************************************
  3. **
  4. ** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved.
  5. **
  6. **                 Meschach Library
  7. ** 
  8. ** This Meschach Library is provided "as is" without any express 
  9. ** or implied warranty of any kind with respect to this software. 
  10. ** In particular the authors shall not be liable for any direct, 
  11. ** indirect, special, incidental or consequential damages arising 
  12. ** in any way from use of the software.
  13. ** 
  14. ** Everyone is granted permission to copy, modify and redistribute this
  15. ** Meschach Library, provided:
  16. **  1.  All copies contain this copyright notice.
  17. **  2.  All modified copies shall carry a notice stating who
  18. **      made the last modification and the date of such modification.
  19. **  3.  No charge is made for this software or works derived from it.  
  20. **      This clause shall not be construed as constraining other software
  21. **      distributed on the same medium as this software, nor is a
  22. **      distribution fee considered a charge.
  23. **
  24. ***************************************************************************/
  25.  
  26.  
  27. /* Main include file for zmeschach library -- complex vectors and matrices */
  28.  
  29. #ifndef ZMATRIXH
  30. #define ZMATRIXH
  31.  
  32. #include "matrix.h"
  33.  
  34.  
  35.           /*  Type definitions for complex vectors and matrices  */
  36.  
  37.  
  38. /* complex definition */
  39. typedef struct  {
  40.                 Real re,im;
  41.         } complex;
  42.  
  43. /* complex vector definition */
  44. typedef struct  {
  45.                 u_int   dim, max_dim;
  46.                 complex  *ve;
  47.                 } ZVEC;
  48.  
  49. /* complex matrix definition */
  50. typedef struct  {
  51.                 u_int   m, n;
  52.                 u_int   max_m, max_n, max_size;
  53.                 complex *base;          /* base is base of alloc'd mem */
  54.                 complex **me;
  55.                 } ZMAT;
  56.  
  57. #define ZVNULL  ((ZVEC *)NULL)
  58. #define ZMNULL  ((ZMAT *)NULL)
  59.  
  60. #define    Z_CONJ        1
  61. #define    Z_NOCONJ    0
  62.  
  63.  
  64. /* memory functions */
  65.  
  66. #ifdef ANSI_C
  67. int zv_get_vars(int dim,...);
  68. int zm_get_vars(int m,int n,...);
  69. int zv_resize_vars(int new_dim,...);
  70. int zm_resize_vars(int m,int n,...);
  71. int zv_free_vars(ZVEC **,...);
  72. int zm_free_vars(ZMAT **,...);
  73.  
  74. #elif VARARGS
  75. int zv_get_vars();
  76. int zm_get_vars();
  77. int zv_resize_vars();
  78. int zm_resize_vars();
  79. int zv_free_vars();
  80. int zm_free_vars();
  81.  
  82. #endif
  83.  
  84.  
  85.  
  86.  
  87. #ifdef ANSI_C
  88. extern ZMAT    *_zm_copy(ZMAT *in,ZMAT *out,u_int i0,u_int j0);
  89. extern ZMAT    * zm_move(ZMAT *, int, int, int, int, ZMAT *, int, int);
  90. extern ZMAT    *zvm_move(ZVEC *, int, ZMAT *, int, int, int, int);
  91. extern ZVEC    *_zv_copy(ZVEC *in,ZVEC *out,u_int i0);
  92. extern ZVEC    * zv_move(ZVEC *, int, int, ZVEC *, int);
  93. extern ZVEC    *zmv_move(ZMAT *, int, int, int, int, ZVEC *, int);
  94. extern complex    z_finput(FILE *fp);
  95. extern ZMAT    *zm_finput(FILE *fp,ZMAT *a);
  96. extern ZVEC     *zv_finput(FILE *fp,ZVEC *x);
  97. extern ZMAT    *zm_add(ZMAT *mat1,ZMAT *mat2,ZMAT *out);
  98. extern ZMAT    *zm_sub(ZMAT *mat1,ZMAT *mat2,ZMAT *out);
  99. extern ZMAT    *zm_mlt(ZMAT *A,ZMAT *B,ZMAT *OUT);
  100. extern ZMAT    *zmma_mlt(ZMAT *A,ZMAT *B,ZMAT *OUT);
  101. extern ZMAT    *zmam_mlt(ZMAT *A,ZMAT *B,ZMAT *OUT);
  102. extern ZVEC    *zmv_mlt(ZMAT *A,ZVEC *b,ZVEC *out);
  103. extern ZMAT    *zsm_mlt(complex scalar,ZMAT *matrix,ZMAT *out);
  104. extern ZVEC    *zvm_mlt(ZMAT *A,ZVEC *b,ZVEC *out);
  105. extern ZMAT    *zm_adjoint(ZMAT *in,ZMAT *out);
  106. extern ZMAT    *zswap_rows(ZMAT *A,int i,int j,int lo,int hi);
  107. extern ZMAT    *zswap_cols(ZMAT *A,int i,int j,int lo,int hi);
  108. extern ZMAT    *mz_mltadd(ZMAT *A1,ZMAT *A2,complex s,ZMAT *out);
  109. extern ZVEC    *zmv_mltadd(ZVEC *v1,ZVEC *v2,ZMAT *A,complex alpha,ZVEC *out);
  110. extern ZVEC    *zvm_mltadd(ZVEC *v1,ZVEC *v2,ZMAT *A,complex alpha,ZVEC *out);
  111. extern ZVEC    *zv_zero(ZVEC *x);
  112. extern ZMAT    *zm_zero(ZMAT *A);
  113. extern ZMAT    *zm_get(int m,int n);
  114. extern ZVEC    *zv_get(int dim);
  115. extern ZMAT    *zm_resize(ZMAT *A,int new_m,int new_n);
  116. extern complex    _zin_prod(ZVEC *x,ZVEC *y,u_int i0,u_int flag);
  117. extern ZVEC    *zv_resize(ZVEC *x,int new_dim);
  118. extern ZVEC    *zv_mlt(complex scalar,ZVEC *vector,ZVEC *out);
  119. extern ZVEC    *zv_add(ZVEC *vec1,ZVEC *vec2,ZVEC *out);
  120. extern ZVEC    *zv_mltadd(ZVEC *v1,ZVEC *v2,complex scale,ZVEC *out);
  121. extern ZVEC    *zv_sub(ZVEC *vec1,ZVEC *vec2,ZVEC *out);
  122. extern ZVEC    *zv_map(complex (*f)(),ZVEC *x,ZVEC *out);
  123. extern ZVEC    *_zv_map(complex (*f)(),void *params,ZVEC *x,ZVEC *out);
  124. extern ZVEC    *zv_lincomb(int n,ZVEC *v[],complex a[],ZVEC *out);
  125. extern ZVEC    *zv_linlist(ZVEC *out,ZVEC *v1,complex a1,...);
  126. extern ZVEC    *zv_star(ZVEC *x1, ZVEC *x2, ZVEC *out);
  127. extern ZVEC    *zv_slash(ZVEC *x1, ZVEC *x2, ZVEC *out);
  128. extern int    zm_free(ZMAT *mat);
  129. extern int    zv_free(ZVEC *vec);
  130.  
  131. extern ZVEC    *zv_rand(ZVEC *x);
  132. extern ZMAT    *zm_rand(ZMAT *A);
  133.  
  134. extern ZVEC    *zget_row(ZMAT *A, int i, ZVEC *out);
  135. extern ZVEC    *zget_col(ZMAT *A, int j, ZVEC *out);
  136. extern ZMAT    *zset_row(ZMAT *A, int i, ZVEC *in);
  137. extern ZMAT    *zset_col(ZMAT *A, int j, ZVEC *in);
  138.  
  139. extern ZVEC    *px_zvec(PERM *pi, ZVEC *in, ZVEC *out);
  140. extern ZVEC    *pxinv_zvec(PERM *pi, ZVEC *in, ZVEC *out);
  141.  
  142. extern void    __zconj__(complex zp[], int len);
  143. extern complex    __zip__(complex zp1[],complex zp2[],int len,int flag);
  144. extern void    __zmltadd__(complex zp1[],complex zp2[],
  145.                 complex s,int len,int flag);
  146. extern void    __zmlt__(complex zp[],complex s,complex out[],int len);
  147. extern void    __zadd__(complex zp1[],complex zp2[],complex out[],int len);
  148. extern void    __zsub__(complex zp1[],complex zp2[],complex out[],int len);
  149. extern void    __zzero__(complex zp[],int len);
  150. extern void    z_foutput(FILE *fp,complex z);
  151. extern void     zm_foutput(FILE *fp,ZMAT *a);
  152. extern void     zv_foutput(FILE *fp,ZVEC *x);
  153. extern void     zm_dump(FILE *fp,ZMAT *a);
  154. extern void     zv_dump(FILE *fp,ZVEC *x);
  155.  
  156. extern double    _zv_norm1(ZVEC *x, VEC *scale);
  157. extern double    _zv_norm2(ZVEC *x, VEC *scale);
  158. extern double    _zv_norm_inf(ZVEC *x, VEC *scale);
  159. extern double    zm_norm1(ZMAT *A);
  160. extern double    zm_norm_inf(ZMAT *A);
  161. extern double    zm_norm_frob(ZMAT *A);
  162.  
  163. complex    zmake(double real, double imag);
  164. double    zabs(complex z);
  165. complex zadd(complex z1,complex z2);
  166. complex zsub(complex z1,complex z2);
  167. complex    zmlt(complex z1,complex z2);
  168. complex    zinv(complex z);
  169. complex    zdiv(complex z1,complex z2);
  170. complex    zsqrt(complex z);
  171. complex    zexp(complex z);
  172. complex    zlog(complex z);
  173. complex    zconj(complex z);
  174. complex    zneg(complex z);
  175. #else
  176. extern ZMAT    *_zm_copy();
  177. extern ZVEC    *_zv_copy();
  178. extern ZMAT    *zm_finput();
  179. extern ZVEC     *zv_finput();
  180. extern ZMAT    *zm_add();
  181. extern ZMAT    *zm_sub();
  182. extern ZMAT    *zm_mlt();
  183. extern ZMAT    *zmma_mlt();
  184. extern ZMAT    *zmam_mlt();
  185. extern ZVEC    *zmv_mlt();
  186. extern ZMAT    *zsm_mlt();
  187. extern ZVEC    *zvm_mlt();
  188. extern ZMAT    *zm_adjoint();
  189. extern ZMAT    *zswap_rows();
  190. extern ZMAT    *zswap_cols();
  191. extern ZMAT    *mz_mltadd();
  192. extern ZVEC    *zmv_mltadd();
  193. extern ZVEC    *zvm_mltadd();
  194. extern ZVEC    *zv_zero();
  195. extern ZMAT    *zm_zero();
  196. extern ZMAT    *zm_get();
  197. extern ZVEC    *zv_get();
  198. extern ZMAT    *zm_resize();
  199. extern ZVEC    *zv_resize();
  200. extern complex    _zin_prod();
  201. extern ZVEC    *zv_mlt();
  202. extern ZVEC    *zv_add();
  203. extern ZVEC    *zv_mltadd();
  204. extern ZVEC    *zv_sub();
  205. extern ZVEC    *zv_map();
  206. extern ZVEC    *_zv_map();
  207. extern ZVEC    *zv_lincomb();
  208. extern ZVEC    *zv_linlist();
  209. extern ZVEC    *zv_star();
  210. extern ZVEC    *zv_slash();
  211.  
  212. extern ZVEC    *px_zvec();
  213. extern ZVEC    *pxinv_zvec();
  214.  
  215. extern ZVEC    *zv_rand();
  216. extern ZMAT    *zm_rand();
  217.  
  218. extern ZVEC    *zget_row();
  219. extern ZVEC    *zget_col();
  220. extern ZMAT    *zset_row();
  221. extern ZMAT    *zset_col();
  222.  
  223. extern int    zm_free();
  224. extern int    zv_free();
  225. extern void    __zconj__();
  226. extern complex    __zip__();
  227. extern void    __zmltadd__();
  228. extern void    __zmlt__();
  229. extern void    __zadd__();
  230. extern void    __zsub__();
  231. extern void    __zzero__();
  232. extern void    zm_foutput();
  233. extern void    zv_foutput();
  234. extern void    zm_dump();
  235. extern void    zv_dump();
  236.  
  237. extern double    _zv_norm1();
  238. extern double    _zv_norm2();
  239. extern double    _zv_norm_inf();
  240. extern double    zm_norm1();
  241. extern double    zm_norm_inf();
  242. extern double    zm_norm_frob();
  243.  
  244. complex    zmake();
  245. double    zabs();
  246. complex zadd();
  247. complex zsub();
  248. complex    zmlt();
  249. complex    zinv();
  250. complex    zdiv();
  251. complex    zsqrt();
  252. complex    zexp();
  253. complex    zlog();
  254. complex    zconj();
  255. complex    zneg();
  256. #endif
  257.  
  258. #define    zv_copy(x,y)    _zv_copy(x,y,0)
  259. #define    zm_copy(A,B)    _zm_copy(A,B,0,0)
  260.  
  261. #define    z_input()    z_finput(stdin)
  262. #define    zv_input(x)    zv_finput(stdin,x)
  263. #define    zm_input(A)    zm_finput(stdin,A)
  264. #define    z_output(z)    z_foutput(stdout,z)
  265. #define    zv_output(x)    zv_foutput(stdout,x)
  266. #define    zm_output(A)    zm_foutput(stdout,A)
  267.  
  268. #define    ZV_FREE(x)    ( zv_free(x), (x) = ZVNULL )
  269. #define    ZM_FREE(A)    ( zm_free(A), (A) = ZMNULL )
  270.  
  271. #define    zin_prod(x,y)    _zin_prod(x,y,0,Z_CONJ)
  272.  
  273. #define    zv_norm1(x)    _zv_norm1(x,VNULL)
  274. #define    zv_norm2(x)    _zv_norm2(x,VNULL)
  275. #define    zv_norm_inf(x)    _zv_norm_inf(x,VNULL)
  276.  
  277.  
  278. #endif
  279.