zmatrix.h 11 KB

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