NEURON
zmatrix.h
Go to the documentation of this file.
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;
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 */
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 #ifdef PROTOTYPES_IN_STRUCT
123 extern ZVEC *zv_map(complex (*f)(),ZVEC *x,ZVEC *out);
124 extern ZVEC *_zv_map(complex (*f)(),void *params,ZVEC *x,ZVEC *out);
125 #else
126 extern ZVEC *zv_map(complex (*f)(complex),ZVEC *x,ZVEC *out);
127 extern ZVEC *_zv_map(complex (*f)(void *,complex),void *params,ZVEC *x,ZVEC *out);
128 #endif
129 extern ZVEC *zv_lincomb(int n,ZVEC *v[],complex a[],ZVEC *out);
130 extern ZVEC *zv_linlist(ZVEC *out,ZVEC *v1,complex a1,...);
131 extern ZVEC *zv_star(ZVEC *x1, ZVEC *x2, ZVEC *out);
132 extern ZVEC *zv_slash(ZVEC *x1, ZVEC *x2, ZVEC *out);
133 extern int zm_free(ZMAT *mat);
134 extern int zv_free(ZVEC *vec);
135 
136 extern ZVEC *zv_rand(ZVEC *x);
137 extern ZMAT *zm_rand(ZMAT *A);
138 
139 extern ZVEC *zget_row(ZMAT *A, int i, ZVEC *out);
140 extern ZVEC *zget_col(ZMAT *A, int j, ZVEC *out);
141 extern ZMAT *zset_row(ZMAT *A, int i, ZVEC *in);
142 extern ZMAT *zset_col(ZMAT *A, int j, ZVEC *in);
143 
144 extern ZVEC *px_zvec(PERM *pi, ZVEC *in, ZVEC *out);
145 extern ZVEC *pxinv_zvec(PERM *pi, ZVEC *in, ZVEC *out);
146 
147 extern void __zconj__(complex zp[], int len);
148 extern complex __zip__(complex zp1[],complex zp2[],int len,int flag);
149 extern void __zmltadd__(complex zp1[],complex zp2[],
150  complex s,int len,int flag);
151 extern void __zmlt__(complex zp[],complex s,complex out[],int len);
152 extern void __zadd__(complex zp1[],complex zp2[],complex out[],int len);
153 extern void __zsub__(complex zp1[],complex zp2[],complex out[],int len);
154 extern void __zzero__(complex zp[],int len);
155 extern void z_foutput(FILE *fp,complex z);
156 extern void zm_foutput(FILE *fp,ZMAT *a);
157 extern void zv_foutput(FILE *fp,ZVEC *x);
158 extern void zm_dump(FILE *fp,ZMAT *a);
159 extern void zv_dump(FILE *fp,ZVEC *x);
160 
161 extern double _zv_norm1(ZVEC *x, VEC *scale);
162 extern double _zv_norm2(ZVEC *x, VEC *scale);
163 extern double _zv_norm_inf(ZVEC *x, VEC *scale);
164 extern double zm_norm1(ZMAT *A);
165 extern double zm_norm_inf(ZMAT *A);
166 extern double zm_norm_frob(ZMAT *A);
167 
168 complex zmake(double real, double imag);
169 double zabs(complex z);
170 complex zadd(complex z1,complex z2);
171 complex zsub(complex z1,complex z2);
172 complex zmlt(complex z1,complex z2);
173 complex zinv(complex z);
174 complex zdiv(complex z1,complex z2);
176 complex zexp(complex z);
177 complex zlog(complex z);
179 complex zneg(complex z);
180 #else
181 extern ZMAT *_zm_copy();
182 extern ZVEC *_zv_copy();
183 extern ZMAT *zm_finput();
184 extern ZVEC *zv_finput();
185 extern ZMAT *zm_add();
186 extern ZMAT *zm_sub();
187 extern ZMAT *zm_mlt();
188 extern ZMAT *zmma_mlt();
189 extern ZMAT *zmam_mlt();
190 extern ZVEC *zmv_mlt();
191 extern ZMAT *zsm_mlt();
192 extern ZVEC *zvm_mlt();
193 extern ZMAT *zm_adjoint();
194 extern ZMAT *zswap_rows();
195 extern ZMAT *zswap_cols();
196 extern ZMAT *mz_mltadd();
197 extern ZVEC *zmv_mltadd();
198 extern ZVEC *zvm_mltadd();
199 extern ZVEC *zv_zero();
200 extern ZMAT *zm_zero();
201 extern ZMAT *zm_get();
202 extern ZVEC *zv_get();
203 extern ZMAT *zm_resize();
204 extern ZVEC *zv_resize();
205 extern complex _zin_prod();
206 extern ZVEC *zv_mlt();
207 extern ZVEC *zv_add();
208 extern ZVEC *zv_mltadd();
209 extern ZVEC *zv_sub();
210 extern ZVEC *zv_map();
211 extern ZVEC *_zv_map();
212 extern ZVEC *zv_lincomb();
213 extern ZVEC *zv_linlist();
214 extern ZVEC *zv_star();
215 extern ZVEC *zv_slash();
216 
217 extern ZVEC *px_zvec();
218 extern ZVEC *pxinv_zvec();
219 
220 extern ZVEC *zv_rand();
221 extern ZMAT *zm_rand();
222 
223 extern ZVEC *zget_row();
224 extern ZVEC *zget_col();
225 extern ZMAT *zset_row();
226 extern ZMAT *zset_col();
227 
228 extern int zm_free();
229 extern int zv_free();
230 extern void __zconj__();
231 extern complex __zip__();
232 extern void __zmltadd__();
233 extern void __zmlt__();
234 extern void __zadd__();
235 extern void __zsub__();
236 extern void __zzero__();
237 extern void zm_foutput();
238 extern void zv_foutput();
239 extern void zm_dump();
240 extern void zv_dump();
241 
242 extern double _zv_norm1();
243 extern double _zv_norm2();
244 extern double _zv_norm_inf();
245 extern double zm_norm1();
246 extern double zm_norm_inf();
247 extern double zm_norm_frob();
248 
249 complex zmake();
250 double zabs();
251 complex zadd();
252 complex zsub();
253 complex zmlt();
254 complex zinv();
255 complex zdiv();
256 complex zsqrt();
257 complex zexp();
258 complex zlog();
259 complex zconj();
260 complex zneg();
261 #endif
262 
263 #define zv_copy(x,y) _zv_copy(x,y,0)
264 #define zm_copy(A,B) _zm_copy(A,B,0,0)
265 
266 #define z_input() z_finput(stdin)
267 #define zv_input(x) zv_finput(stdin,x)
268 #define zm_input(A) zm_finput(stdin,A)
269 #define z_output(z) z_foutput(stdout,z)
270 #define zv_output(x) zv_foutput(stdout,x)
271 #define zm_output(A) zm_foutput(stdout,A)
272 
273 #define ZV_FREE(x) ( zv_free(x), (x) = ZVNULL )
274 #define ZM_FREE(A) ( zm_free(A), (A) = ZMNULL )
275 
276 #define zin_prod(x,y) _zin_prod(x,y,0,Z_CONJ)
277 
278 #define zv_norm1(x) _zv_norm1(x,VNULL)
279 #define zv_norm2(x) _zv_norm2(x,VNULL)
280 #define zv_norm_inf(x) _zv_norm_inf(x,VNULL)
281 
282 
283 #endif
int zv_resize_vars(int new_dim,...)
Definition: zmemory.c:468
void zv_dump(FILE *fp, ZVEC *x)
Definition: zmatio.c:382
#define B(i)
Definition: multisplit.cpp:62
ZVEC * _zv_copy(ZVEC *in, ZVEC *out, u_int i0)
Definition: zcopy.c:58
complex zexp(complex z)
Definition: zfunc.c:204
int zv_free_vars(ZVEC **,...)
Definition: zmemory.c:515
ZMAT * mz_mltadd(ZMAT *A1, ZMAT *A2, complex s, ZMAT *out)
Definition: zmatop.c:398
ZMAT * zsm_mlt(complex scalar, ZMAT *matrix, ZMAT *out)
Definition: zmatop.c:243
complex zsqrt(complex z)
Definition: zfunc.c:175
double _zv_norm1(ZVEC *x, VEC *scale)
Definition: znorm.c:41
ZVEC * zget_row(ZMAT *A, int i, ZVEC *out)
Definition: zmatop.c:541
ZVEC * zv_linlist(ZVEC *out, ZVEC *v1, complex a1,...)
Definition: zvecop.c:235
complex zinv(complex z)
Definition: zfunc.c:135
ZVEC * zget_col(ZMAT *A, int j, ZVEC *out)
Definition: zmatop.c:520
#define Real
Definition: machine.h:189
int zm_free(ZMAT *mat)
Definition: zmemory.c:149
ZVEC * pxinv_zvec(PERM *pi, ZVEC *in, ZVEC *out)
Definition: zvecop.c:466
void __zmlt__(complex zp[], complex s, complex out[], int len)
complex zsub(complex z1, complex z2)
Definition: zfunc.c:107
void __zconj__(complex zp[], int len)
ZVEC * px_zvec(PERM *pi, ZVEC *in, ZVEC *out)
Definition: zvecop.c:397
int zv_free(ZVEC *vec)
Definition: zmemory.c:195
ZVEC * zv_lincomb(int n, ZVEC *v[], complex a[], ZVEC *out)
ZVEC * zvm_mlt(ZMAT *A, ZVEC *b, ZVEC *out)
Definition: zmatop.c:264
complex z_finput(FILE *fp)
Definition: zmatio.c:44
ZVEC * zv_map(complex(*f)(complex), ZVEC *x, ZVEC *out)
void zv_foutput(FILE *fp, ZVEC *x)
Definition: zmatio.c:333
ZVEC * zv_move(ZVEC *, int, int, ZVEC *, int)
Definition: zcopy.c:118
#define v
Definition: md1redef.h:4
ZVEC * zv_mltadd(ZVEC *v1, ZVEC *v2, complex scale, ZVEC *out)
Definition: zvecop.c:95
ZVEC * zv_get(int dim)
Definition: zmemory.c:122
ZMAT * zm_mlt(ZMAT *A, ZMAT *B, ZMAT *OUT)
Definition: zmatop.c:94
ZMAT * zm_sub(ZMAT *mat1, ZMAT *mat2, ZMAT *out)
Definition: zmatop.c:63
Definition: zmatrix.h:50
complex zneg(complex z)
Definition: zfunc.c:53
Definition: zmatrix.h:44
void __zmltadd__(complex zp1[], complex zp2[], complex s, int len, int flag)
u_int max_dim
Definition: zmatrix.h:45
Definition: matrix.h:67
complex _zin_prod(ZVEC *x, ZVEC *y, u_int i0, u_int flag)
Definition: zvecop.c:38
complex zconj(complex z)
Definition: zfunc.c:233
ZVEC * zmv_mlt(ZMAT *A, ZVEC *b, ZVEC *out)
Definition: zmatop.c:207
ZMAT * zm_move(ZMAT *, int, int, int, int, ZMAT *, int, int)
Definition: zcopy.c:90
static Frame * fp
Definition: code.cpp:154
void z_foutput(FILE *fp, complex z)
Definition: zmatio.c:302
uint32_t u_int
Definition: machine.h:38
ZMAT * zm_resize(ZMAT *A, int new_m, int new_n)
Definition: zmemory.c:227
int const size_t const size_t n
Definition: nrngsl.h:12
int zv_get_vars(int dim,...)
Definition: zmemory.c:418
_CONST char * s
Definition: system.cpp:74
ZMAT * zset_col(ZMAT *A, int j, ZVEC *in)
Definition: zmatop.c:565
double _zv_norm2(ZVEC *x, VEC *scale)
Definition: znorm.c:78
int zm_get_vars(int m, int n,...)
Definition: zmemory.c:436
complex __zip__(complex zp1[], complex zp2[], int len, int flag)
ZMAT * zswap_cols(ZMAT *A, int i, int j, int lo, int hi)
Definition: zmatop.c:371
int zm_resize_vars(int m, int n,...)
Definition: zmemory.c:486
complex * ve
Definition: zmatrix.h:46
u_int max_size
Definition: zmatrix.h:52
int zm_free_vars(ZMAT **,...)
Definition: zmemory.c:536
ZVEC * zv_star(ZVEC *x1, ZVEC *x2, ZVEC *out)
Definition: zvecop.c:319
Real re
Definition: zmatrix.h:40
ZMAT * zm_adjoint(ZMAT *in, ZMAT *out)
Definition: zmatop.c:301
void __zsub__(complex zp1[], complex zp2[], complex out[], int len)
ZVEC * zmv_move(ZMAT *, int, int, int, int, ZVEC *, int)
Definition: zcopy.c:142
complex * base
Definition: zmatrix.h:53
double _zv_norm_inf(ZVEC *x, VEC *scale)
Definition: znorm.c:109
ZMAT * zset_row(ZMAT *A, int i, ZVEC *in)
Definition: zmatop.c:584
ZVEC * zv_rand(ZVEC *x)
Definition: zvecop.c:502
complex zmake(double real, double imag)
Definition: zfunc.c:41
size_t j
#define alpha
Definition: bkpfacto.c:43
complex zlog(complex z)
Definition: zfunc.c:220
ZMAT * zvm_move(ZVEC *, int, ZMAT *, int, int, int, int)
Definition: zcopy.c:170
double zm_norm_inf(ZMAT *A)
Definition: znorm.c:167
complex zdiv(complex z1, complex z2)
Definition: zfunc.c:166
void zm_foutput(FILE *fp, ZMAT *a)
Definition: zmatio.c:310
ZVEC * zv_zero(ZVEC *x)
Definition: zmemory.c:39
void __zadd__(complex zp1[], complex zp2[], complex out[], int len)
complex zadd(complex z1, complex z2)
Definition: zfunc.c:93
ZMAT * zm_get(int m, int n)
Definition: zmemory.c:65
ZMAT * zm_add(ZMAT *mat1, ZMAT *mat2, ZMAT *out)
Definition: zmatop.c:38
ZVEC * zv_resize(ZVEC *x, int new_dim)
Definition: zmemory.c:362
void zm_dump(FILE *fp, ZMAT *a)
Definition: zmatio.c:353
u_int n
Definition: zmatrix.h:51
ZMAT * zmam_mlt(ZMAT *A, ZMAT *B, ZMAT *OUT)
Definition: zmatop.c:175
ZMAT * _zm_copy(ZMAT *in, ZMAT *out, u_int i0, u_int j0)
Definition: zcopy.c:35
#define i
Definition: md1redef.h:12
#define A(i)
Definition: multisplit.cpp:61
ZVEC * zv_sub(ZVEC *vec1, ZVEC *vec2, ZVEC *out)
Definition: zvecop.c:128
#define OUT
Definition: matrix.h:51
ZVEC * _zv_map(complex(*f)(void *, complex), void *params, ZVEC *x, ZVEC *out)
ZMAT * zm_zero(ZMAT *A)
Definition: zmemory.c:51
void __zzero__(complex zp[], int len)
ZMAT * zm_finput(FILE *fp, ZMAT *a)
Definition: zmatio.c:77
ZVEC * zv_mlt(complex scalar, ZVEC *vector, ZVEC *out)
Definition: zvecop.c:54
ZVEC * zv_finput(FILE *fp, ZVEC *x)
Definition: zmatio.c:193
complex ** me
Definition: zmatrix.h:54
ZMAT * zswap_rows(ZMAT *A, int i, int j, int lo, int hi)
Definition: zmatop.c:346
double zabs(complex z)
Definition: zfunc.c:65
ZMAT * zmma_mlt(ZMAT *A, ZMAT *B, ZMAT *OUT)
Definition: zmatop.c:140
ZVEC * zv_slash(ZVEC *x1, ZVEC *x2, ZVEC *out)
Definition: zvecop.c:347
ZVEC * zvm_mltadd(ZVEC *v1, ZVEC *v2, ZMAT *A, complex alpha, ZVEC *out)
Definition: zmatop.c:484
Definition: matrix.h:87
ZVEC * zmv_mltadd(ZVEC *v1, ZVEC *v2, ZMAT *A, complex alpha, ZVEC *out)
Definition: zmatop.c:440
ZVEC * zv_add(ZVEC *vec1, ZVEC *vec2, ZVEC *out)
Definition: zvecop.c:76
double zm_norm1(ZMAT *A)
Definition: znorm.c:142
double zm_norm_frob(ZMAT *A)
Definition: znorm.c:191
ZMAT * zm_rand(ZMAT *A)
Definition: zmatop.c:604
complex zmlt(complex z1, complex z2)
Definition: zfunc.c:121