ROOT  6.06/09
Reference Guide
TCernLib.h
Go to the documentation of this file.
1 // @(#)root/table:$Id$
2 // Author: Valery Fine(fine@bnl.gov) 25/09/99
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TCernLib
13 #define ROOT_TCernLib
14 
15 #include "Rtypes.h"
16 #include <string.h>
17 
18 // http://wwwinfo.cern.ch/asdoc/shortwrupsdir/f110/top.html
19 
20 ///////////////////////////////////////////////////////////////////////////////////////
21 // //
22 // The routines of MXPACK compute the product of two matrices or the product of //
23 // their transposed matrices and may add or subtract to the resultant matrix //
24 // a third one, add or subtract one matrix from another, or transfer a matrix, //
25 // its negative, or a multiple of it, transpose a given matrix, build up a unit //
26 // matrix, multiply a matrix by a diagonal (from left or from right) and may //
27 // add the result to another matrix, add to square matrix the multiple of a diagonal //
28 // matrix, compute the products <IMG WIDTH=79 HEIGHT=12 ALIGN=BOTTOM ALT="tex2html_wrap_inline191" SRC="gif/mxpack_ABAt.gif"> (<IMG WIDTH=16 HEIGHT=12 ALIGN=BOTTOM ALT="tex2html_wrap_inline193" SRC="gif/mxpack_At.gif"> denotes the transpose of <IMG WIDTH=1
29 // It is assumed that matrices are begin_html <B>row-wise without gaps</B> end_html without gaps. //
30 // //
31 ///////////////////////////////////////////////////////////////////////////////////////
32 
33 class TArrayD;
34 
35 class TCL {
36 public:
37  virtual ~TCL() { }
38 
39  static int *ucopy(const int *a, int *b, int n);
40  static float *ucopy(const float *a, float *b, int n);
41  static double *ucopy(const float *a, double *b, int n);
42  static float *ucopy(const double *a, float *b, int n);
43  static double *ucopy(const double *a, double *b, int n);
44  static void **ucopy(const void **a, void **b, int n);
45 
46  static float *vzero(float *a, int n2);
47  static double *vzero(double *a, int n2);
48  static void **vzero(void **a, int n2);
49 
50  static float *vadd(const float *b, const float *c, float *a, int n);
51  static double *vadd(const double *b, const double *c, double *a, int n);
52 
53  static float *vadd(const float *b, const double *c, float *a, int n);
54  static double *vadd(const double *b, const float *c,double *a, int n);
55 
56  static float vdot(const float *b, const float *a, int n);
57  static double vdot(const double *b, const double *a, int n);
58 
59  static float *vsub(const float *a, const float *b, float *x, int n);
60  static double *vsub(const double *a, const double *b, double *x, int n);
61  static float *vsub(const float *b, const double *c, float *a, int n);
62  static double *vsub(const double *b, const float *c, double *a, int n);
63 
64  static float *vcopyn(const float *a, float *x, int n);
65  static double *vcopyn(const double *a, double *x, int n);
66 
67  static float *vscale(const float *a, float scale, float *b, int n);
68  static double *vscale(const double *a, double scale, double *b, int n);
69 
70  static float *vlinco(const float *a, float fa, const float *b, float fb,float *x, int n);
71  static double *vlinco(const double *a, double fa, const double *b, double fb,double *x, int n);
72 
73  static float *vmatl(const float *g, const float *c, float *x, int n=3,int m=3);
74  static double *vmatl(const double *g, const double *c, double *x, int n=3,int m=3);
75 
76  static float *vmatr(const float *c, const float *g, float *x, int n=3,int m=3);
77  static double *vmatr(const double *c, const double *g, double *x, int n=3,int m=3);
78 
79  static float *mxmad_0_(int n, const float *a, const float *b, float *c, int i, int j, int k);
80 
81  static float *mxmad( const float *a, const float *b, float *c, int i, int j, int k);
82  static float *mxmad1(const float *a, const float *b, float *c, int i, int j, int k);
83  static float *mxmad2(const float *a, const float *b, float *c, int i, int j, int k);
84  static float *mxmad3(const float *a, const float *b, float *c, int i, int j, int k);
85  static float *mxmpy( const float *a, const float *b, float *c, int i, int j, int k);
86  static float *mxmpy1(const float *a, const float *b, float *c, int i, int j, int k);
87  static float *mxmpy2(const float *a, const float *b, float *c, int i, int j, int k);
88  static float *mxmpy3(const float *a, const float *b, float *c, int i, int j, int k);
89  static float *mxmub( const float *a, const float *b, float *c, int i, int j, int k);
90  static float *mxmub1(const float *a, const float *b, float *c, int i, int j, int k);
91  static float *mxmub2(const float *a, const float *b, float *c, int i, int j, int k);
92  static float *mxmub3(const float *a, const float *b, float *c, int i, int j, int k);
93 
94  static float *mxmlrt_0_(int n__, const float *a, const float *b, float *c, int ni,int nj);
95  static float *mxmlrt(const float *a, const float *b, float *c, int ni, int nj);
96  static float *mxmltr(const float *a, const float *b, float *c, int ni, int nj);
97  static float *mxtrp(const float *a, float *b, int i, int j);
98 
99  static double *mxmad_0_(int n, const double *a, const double *b, double *c, int i, int j, int k);
100 
101  static double *mxmad (const double *a, const double *b, double *c, int i, int j, int k);
102  static double *mxmad1(const double *a, const double *b, double *c, int i, int j, int k);
103  static double *mxmad2(const double *a, const double *b, double *c, int i, int j, int k);
104  static double *mxmad3(const double *a, const double *b, double *c, int i, int j, int k);
105  static double *mxmpy (const double *a, const double *b, double *c, int i, int j, int k);
106  static double *mxmpy1(const double *a, const double *b, double *c, int i, int j, int k);
107  static double *mxmpy2(const double *a, const double *b, double *c, int i, int j, int k);
108  static double *mxmpy3(const double *a, const double *b, double *c, int i, int j, int k);
109  static double *mxmub (const double *a, const double *b, double *c, int i, int j, int k);
110  static double *mxmub1(const double *a, const double *b, double *c, int i, int j, int k);
111  static double *mxmub2(const double *a, const double *b, double *c, int i, int j, int k);
112  static double *mxmub3(const double *a, const double *b, double *c, int i, int j, int k);
113 
114  static double *mxmlrt_0_(int n__, const double *a, const double *b, double *c, int ni,int nj);
115  static double *mxmlrt(const double *a, const double *b, double *c, int ni, int nj);
116  static double *mxmltr(const double *a, const double *b, double *c, int ni, int nj);
117  static double *mxtrp(const double *a, double *b, int i, int j);
118 
119 // * TR pack
120 
121  static float *traat(const float *a, float *s, int m, int n);
122  static float *tral(const float *a, const float *u, float *b, int m, int n);
123  static float *tralt(const float *a, const float *u, float *b, int m, int n);
124  static float *tras(const float *a, const float *s, float *b, int m, int n);
125  static float *trasat(const float *a, const float *s, float *r, int m, int n);
126  static float *trasat(const double *a, const float *s, float *r, int m, int n);
127  static float *trata(const float *a, float *r, int m, int n);
128  static float *trats(const float *a, const float *s, float *b, int m, int n);
129  static float *tratsa(const float *a, const float *s, float *r, int m, int n);
130  static float *trchlu(const float *a, float *b, int n);
131  static float *trchul(const float *a, float *b, int n);
132  static float *trinv(const float *t, float *s, int n);
133  static float *trla(const float *u, const float *a, float *b, int m, int n);
134  static float *trlta(const float *u, const float *a, float *b, int m, int n);
135  static float *trpck(const float *s, float *u, int n);
136  static float *trqsq(const float *q, const float *s, float *r, int m);
137  static float *trsa(const float *s, const float *a, float *b, int m, int n);
138  static float *trsinv(const float *g, float *gi, int n);
139  static float *trsmlu(const float *u, float *s, int n);
140  static float *trsmul(const float *g, float *gi, int n);
141  static float *trupck(const float *u, float *s, int m);
142  static float *trsat(const float *s, const float *a, float *b, int m, int n);
143 
144 // Victor Perevoztchikov's addition:
145  static float *trsequ(float *smx, int m=3, float *b=0, int n=1);
146 
147 // --- double version
148 
149  static double *traat (const double *a, double *s, int m, int n);
150  static double *tral (const double *a, const double *u, double *b, int m, int n);
151  static double *tralt (const double *a, const double *u, double *b, int m, int n);
152  static double *tras (const double *a, const double *s, double *b, int m, int n);
153  static double *trasat(const double *a, const double *s, double *r, int m, int n);
154  static double *trata (const double *a, double *r, int m, int n);
155  static double *trats (const double *a, const double *s, double *b, int m, int n);
156  static double *tratsa(const double *a, const double *s, double *r, int m, int n);
157  static double *trchlu(const double *a, double *b, int n);
158  static double *trchul(const double *a, double *b, int n);
159  static double *trinv (const double *t, double *s, int n);
160  static double *trla (const double *u, const double *a, double *b, int m, int n);
161  static double *trlta (const double *u, const double *a, double *b, int m, int n);
162  static double *trpck (const double *s, double *u, int n);
163  static double *trqsq (const double *q, const double *s, double *r, int m);
164  static double *trsa (const double *s, const double *a, double *b, int m, int n);
165  static double *trsinv(const double *g, double *gi, int n);
166  static double *trsmlu(const double *u, double *s, int n);
167  static double *trsmul(const double *g, double *gi, int n);
168  static double *trupck(const double *u, double *s, int m);
169  static double *trsat (const double *s, const double *a, double *b, int m, int n);
170 
171 // Victor Perevoztchikov's addition:
172  static double *trsequ(double *smx, int m=3, double *b=0, int n=1);
173 
174  ClassDef(TCL,0) //C++ replacement for CERNLIB matrix / triangle matrix packages: F110 and F112
175 
176 };
177 
178 //___________________________________________________________________________
179 inline float *TCL::mxmad(const float *a, const float *b, float *c, int i, int j, int k)
180 {
181  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
182  return mxmad_0_(0, a, b, c, i, j, k); }
183 
184 //___________________________________________________________________________
185 inline float *TCL::mxmad1(const float *a, const float *q, float *c, int i, int j, int k)
186 {
187  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad1.gif"> </P> End_Html //
188  return mxmad_0_(1, a, q, c, i, j, k); }
189 
190 //___________________________________________________________________________
191 inline float *TCL::mxmad2(const float *p, const float *b, float *c, int i, int j, int k)
192 {
193  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad2.gif"> </P> End_Html //
194  return mxmad_0_(2, p, b, c, i, j, k); }
195 
196 //___________________________________________________________________________
197 inline float *TCL::mxmad3(const float *p, const float *q, float *c, int i, int j, int k)
198 {
199  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad3.gif"> </P> End_Html //
200  return mxmad_0_(3, p, q, c, i, j, k); }
201 
202 //___________________________________________________________________________
203 inline float *TCL::mxmpy(const float *a, const float *b, float *c, int i, int j, int k)
204 {
205  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmpy.gif"> </P> End_Html //
206  return mxmad_0_(4, a, b, c, i, j, k); }
207 
208 //___________________________________________________________________________
209 inline float *TCL::mxmpy1(const float *a, const float *q, float *c, int i, int j, int k)
210 {
211  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmpy1.gif"> </P> End_Html //
212  return mxmad_0_(5, a, q, c, i, j, k); }
213 
214 //___________________________________________________________________________
215 inline float *TCL::mxmpy2(const float *p, const float *b, float *c, int i, int j, int k)
216 {
217  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmpy2.gif"> </P> End_Html //
218  return mxmad_0_(6, p, b, c, i, j, k); }
219 
220 //___________________________________________________________________________
221 inline float *TCL::mxmpy3(const float *p, const float *q, float *c, int i, int j, int k)
222 {
223  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmpy3.gif"> </P> End_Html //
224  return mxmad_0_(7, p, q, c, i, j, k); }
225 
226 //___________________________________________________________________________
227 inline float *TCL::mxmub(const float *a, const float *b, float *c, int i, int j, int k)
228 {
229  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmub.gif"> </P> End_Html //
230  return mxmad_0_(8, a, b, c, i, j, k); }
231 
232 //___________________________________________________________________________
233 inline float *TCL::mxmub1(const float *a, const float *q, float *c, int i, int j, int k)
234 {
235  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmub1.gif"> </P> End_Html //
236  return mxmad_0_(9, a, q, c, i, j, k); }
237 
238 //___________________________________________________________________________
239 inline float *TCL::mxmub2(const float *p, const float *b, float *c, int i, int j, int k)
240 {
241  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmub2.gif"> </P> End_Html //
242  return mxmad_0_(10, p, b, c, i, j, k); }
243 
244 //___________________________________________________________________________
245 inline float *TCL::mxmub3(const float *p, const float *q, float *c, int i, int j, int k)
246 {
247  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmub3.gif"> </P> End_Html //
248  return mxmad_0_(11, p, q, c, i, j, k); }
249 
250 //___________________________________________________________________________
251 inline float *TCL::mxmlrt(const float *a, const float *b, float *x, int ni, int nj)
252 {
253  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmlrt.gif"> </P> End_Html //
254  return mxmlrt_0_(0, a, b, x, ni, nj); }
255 
256 //___________________________________________________________________________
257 inline float *TCL::mxmltr(const float *a, const float *b, float *x, int ni, int nj)
258 {
259  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmltr.gif"> </P> End_Html //
260  return mxmlrt_0_(1, a, b, x, ni, nj); }
261 
262 
263 //-- double version --
264 
265 //___________________________________________________________________________
266 inline double *TCL::mxmad(const double *a, const double *b, double *c, int i, int j, int k)
267 {
268  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
269  return mxmad_0_(0, a, b, c, i, j, k); }
270 
271 //___________________________________________________________________________
272 inline double *TCL:: mxmad1(const double *a, const double *b, double *c, int i, int j, int k)
273 {
274  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
275  return mxmad_0_(1, a, b, c, i, j, k); }
276 
277 //___________________________________________________________________________
278 inline double *TCL::mxmad2(const double *a, const double *b, double *c, int i, int j, int k)
279 {
280  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
281  return mxmad_0_(2, a, b, c, i, j, k); }
282 
283 //___________________________________________________________________________
284 inline double *TCL::mxmad3(const double *a, const double *b, double *c, int i, int j, int k)
285 {
286  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
287  return mxmad_0_(3, a, b, c, i, j, k); }
288 
289 //___________________________________________________________________________
290 inline double *TCL::mxmpy(const double *a, const double *b, double *c, int i, int j, int k)
291 {
292  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
293  return mxmad_0_(4, a, b, c, i, j, k); }
294 
295 //___________________________________________________________________________
296 inline double *TCL::mxmpy1(const double *a, const double *b, double *c, int i, int j, int k)
297 {
298  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
299  return mxmad_0_(5, a, b, c, i, j, k); }
300 
301 //___________________________________________________________________________
302 inline double *TCL::mxmpy2(const double *a, const double *b, double *c, int i, int j, int k)
303 {
304  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
305  return mxmad_0_(6, a, b, c, i, j, k); }
306 
307 //___________________________________________________________________________
308 inline double *TCL::mxmpy3(const double *a, const double *b, double *c, int i, int j, int k)
309 {
310  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
311  return mxmad_0_(7, a, b, c, i, j, k); }
312 
313 //___________________________________________________________________________
314 inline double *TCL::mxmub(const double *a, const double *b, double *c, int i, int j, int k)
315 {
316  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
317  return mxmad_0_(8, a, b, c, i, j, k); }
318 
319 //___________________________________________________________________________
320 inline double *TCL::mxmub1(const double *a, const double *b, double *c, int i, int j, int k)
321 {
322  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
323  return mxmad_0_(9, a, b, c, i, j, k); }
324 
325 //___________________________________________________________________________
326 inline double *TCL::mxmub2(const double *a, const double *b, double *c, int i, int j, int k)
327 {
328  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
329  return mxmad_0_(10, a, b, c, i, j, k); }
330 
331 //___________________________________________________________________________
332 inline double *TCL::mxmub3(const double *a, const double *b, double *c, int i, int j, int k)
333 {
334  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
335  return mxmad_0_(11, a, b, c, i, j, k); }
336 
337 //___________________________________________________________________________
338 inline double *TCL::mxmlrt(const double *a, const double *b, double *c, int ni, int nj)
339 {
340  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
341  return mxmlrt_0_(0, a, b, c, ni, nj); }
342 
343 //___________________________________________________________________________
344 inline double *TCL::mxmltr(const double *a, const double *b, double *c, int ni, int nj)
345 {
346  // Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/mxpack_mxmad.gif"> </P> End_Html //
347  return mxmlrt_0_(1, a, b, c, ni, nj); }
348 
349 // ----
350 
351 //________________________________________________________
352 inline int *TCL::ucopy(const int *b, int *a, int n)
353 {
354  //to be documented
355  if (n <= 0) return 0;
356  memcpy(a,b,n*sizeof(int));
357  return a;
358 }
359 
360 //________________________________________________________
361 inline float *TCL::ucopy(const float *b, float *a, int n)
362 {
363  //to be documented
364  if (n <= 0) return 0;
365  memcpy(a,b,n*sizeof(float));
366  return a;
367 }
368 
369 //________________________________________________________
370 inline float *TCL::ucopy(const double *b, float *a, int n)
371 {
372  //to be documented
373  if (n <= 0) return 0;
374  for (int i=0;i<n;i++,a++,b++) *a = float(*b);
375  return a;
376 }
377 
378 //________________________________________________________
379 inline double *TCL::ucopy(const float *b, double *a, int n)
380 {
381  //to be documented
382  if (n <= 0) return 0;
383  for (int i=0;i<n;i++,a++,b++) *a = double(*b);
384  return a;
385 }
386 
387 //________________________________________________________
388 inline double *TCL::ucopy(const double *b, double *a, int n)
389 {
390  //to be documented
391  if (n <= 0) return 0;
392  memcpy(a,b,n*sizeof(double));
393  return a;
394 }
395 
396 //________________________________________________________
397 inline void **TCL::ucopy(const void **b, void **a, int n)
398 {
399  //to be documented
400  if (n <= 0) return 0;
401  memcpy(a,b,n*sizeof(void *));
402  return a;
403 }
404 
405 
406 //________________________________________________________
407 inline float *TCL::vadd(const float *b, const float *c, float *a, int n)
408 {
409  //to be documented
410  if (n <= 0) return 0;
411  for (int i=0;i<n;i++) a[i] = b[i] + c[i];
412  return a;
413 }
414 
415 //________________________________________________________
416 inline double *TCL::vadd(const double *b, const double *c, double *a, int n)
417 {
418  //to be documented
419  if (n <= 0) return 0;
420  for (int i=0;i<n;i++) a[i] = b[i] + c[i];
421  return a;
422 }
423 
424 //________________________________________________________
425 inline float *TCL::vadd(const float *b, const double *c, float *a, int n)
426 {
427  //to be documented
428  if (n <= 0) return 0;
429  for (int i=0;i<n;i++) a[i] = b[i] + c[i];
430  return a;
431 }
432 
433 //________________________________________________________
434 inline double *TCL::vadd(const double *b, const float *c, double *a, int n)
435 {
436  //to be documented
437  if (n <= 0) return 0;
438  for (int i=0;i<n;i++) a[i] = b[i] + c[i];
439  return a;
440 }
441 
442 //________________________________________________________
443 inline float TCL::vdot(const float *b, const float *a, int n)
444 {
445  //to be documented
446  float x=0;
447  if (n>0)
448  for (int i=0;i<n;i++,a++,b++) x += (*a) * (*b);
449  return x;
450 }
451 //________________________________________________________
452 inline double TCL::vdot(const double *b, const double *a, int n)
453 {
454  //to be documented
455  double x=0;
456  if (n>0)
457  for (int i=0;i<n;i++,a++,b++) x += (*a) * (*b);
458  return x;
459 }
460 //________________________________________________________
461 inline float *TCL::vsub(const float *a, const float *b, float *x, int n)
462 {
463  //to be documented
464  if (n <= 0) return 0;
465  for (int i=0;i<n;i++) x[i] = a[i]-b[i];
466  return x;
467 }
468 
469 //________________________________________________________
470 inline double *TCL::vsub(const double *a, const double *b, double *x, int n)
471 {
472  //to be documented
473  if (n <= 0) return 0;
474  for (int i=0;i<n;i++) x[i] = a[i]-b[i];
475  return x;
476 }
477 //________________________________________________________
478 inline float *TCL::vsub(const float *b, const double *c, float *a, int n)
479 {
480  //to be documented
481  if (n <= 0) return 0;
482  for (int i=0;i<n;i++) a[i] = b[i] - c[i];
483  return a;
484 }
485 
486 //________________________________________________________
487 inline double *TCL::vsub(const double *b, const float *c, double *a, int n)
488 {
489  //to be documented
490  if (n <= 0) return 0;
491  for (int i=0;i<n;i++) a[i] = b[i] - c[i];
492  return a;
493 }
494 //________________________________________________________
495 inline float *TCL::vcopyn(const float *a, float *x, int n)
496 {
497  //to be documented
498  if (n <= 0) return 0;
499  for (int i=0;i<n;i++) x[i] = -a[i];
500  return x;
501 }
502 //________________________________________________________
503 inline double *TCL::vcopyn(const double *a, double *x, int n)
504 {
505  //to be documented
506  if (n <= 0) return 0;
507  for (int i=0;i<n;i++) x[i] = -a[i];
508  return x;
509 }
510 
511 //________________________________________________________
512 inline float *TCL::vzero(float *a, int n1)
513 {
514  //to be documented
515  if (n1 <= 0) return 0;
516  return (float *)memset(a,0,n1*sizeof(float));
517 }
518 
519 //________________________________________________________
520 inline double *TCL::vzero(double *a, int n1)
521 {
522  //to be documented
523  if (n1 <= 0) return 0;
524  return (double *)memset(a,0,n1*sizeof(double));
525 }
526 
527 //________________________________________________________
528 inline void **TCL::vzero(void **a, int n1)
529 {
530  //to be documented
531  if (n1 <= 0) return 0;
532  return (void **)memset(a,0,n1*sizeof(void *));
533 }
534 
535 //________________________________________________________
536 inline float *TCL::vscale(const float *a, float scale, float *b, int n)
537 {
538  //to be documented
539  for (int i=0;i<n;i++) b[i]=scale*a[i];
540  return b;
541 }
542 
543 //________________________________________________________
544 inline double *TCL::vscale(const double *a, double scale, double *b, int n)
545 {
546  //to be documented
547  for (int i=0;i<n;i++) b[i]=scale*a[i];
548  return b;
549 }
550 
551 //________________________________________________________
552 inline float *TCL::vlinco(const float *a, float fa, const float *b, float fb, float *x, int n)
553 {
554  //to be documented
555  for (int i=0;i<n;i++){x[i]=a[i]*fa+b[i]*fb;};
556  return x;
557 }
558 
559 //________________________________________________________
560 inline double *TCL::vlinco(const double *a, double fa, const double *b, double fb,double *x, int n)
561 {
562  //to be documented
563  for (int i=0;i<n;i++) x[i]=a[i]*fa+b[i]*fb;
564  return x;
565 }
566 
567 //_____________________________________________________________________________
568 inline float *TCL::vmatl(const float *G, const float *c, float *x, int n,int m)
569 {
570  // x = G*c
571  for (int i=0; i<n; i++) {
572  double sum = 0;
573  for (int j=0; j<m; j++) sum += G[j + m*i]*c[j];
574  x[i] = sum;
575  }
576  return x;
577 }
578 
579 //_____________________________________________________________________________
580 inline double *TCL::vmatl(const double *G, const double *c, double *x, int n,int m)
581 {
582  // x = G*c
583  for (int i=0; i<n; i++) {
584  double sum = 0;
585  for (int j=0; j<m; j++) sum += G[j + m*i]*c[j];
586  x[i] = sum;
587  }
588  return x;
589 }
590 
591 //_____________________________________________________________________________
592 inline float *TCL::vmatr(const float *c, const float *G, float *x, int n,int m)
593 {
594  // x = c*G
595  for (int j=0; j<m; j++) {
596  double sum = 0;
597  for (int i=0; i<n; i++) sum += G[j + n*i]*c[i];
598  x[j] = sum;
599  }
600  return x;
601 }
602 
603 //_____________________________________________________________________________
604 inline double *TCL::vmatr(const double *c, const double *G, double *x, int n,int m)
605 {
606  // x = c*G
607  for (int j=0; j<m; j++) {
608  double sum = 0;
609  for (int i=0; i<n; i++) sum += G[j + n*i]*c[i];
610  x[j] = sum;
611  }
612  return x;
613 }
614 
615 #endif
static float * mxmad2(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:191
static float * trla(const float *u, const float *a, float *b, int m, int n)
static float * mxmlrt(const float *a, const float *b, float *c, int ni, int nj)
Definition: TCernLib.h:251
static float * trchlu(const float *a, float *b, int n)
Definition: TCernLib.h:35
static float * trsa(const float *s, const float *a, float *b, int m, int n)
static float * mxmad_0_(int n, const float *a, const float *b, float *c, int i, int j, int k)
static float * trsmul(const float *g, float *gi, int n)
static float * mxmpy1(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:209
static float * trinv(const float *t, float *s, int n)
static float * vmatr(const float *c, const float *g, float *x, int n=3, int m=3)
Definition: TCernLib.h:592
static float * tratsa(const float *a, const float *s, float *r, int m, int n)
static float * mxmpy3(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:221
static float * trlta(const float *u, const float *a, float *b, int m, int n)
static float * tras(const float *a, const float *s, float *b, int m, int n)
TArc * a
Definition: textangle.C:12
static float * trsmlu(const float *u, float *s, int n)
static float * trsat(const float *s, const float *a, float *b, int m, int n)
static float * mxmltr(const float *a, const float *b, float *c, int ni, int nj)
Definition: TCernLib.h:257
static float * trsequ(float *smx, int m=3, float *b=0, int n=1)
#define G(x, y, z)
static float * trpck(const float *s, float *u, int n)
static float * mxtrp(const float *a, float *b, int i, int j)
Matrix Transposition CERN PROGLIB# F110 MXTRP .VERSION KERNFOR 1.0 650809 ORIG.
Definition: TCernLib.cxx:224
static float * vscale(const float *a, float scale, float *b, int n)
Definition: TCernLib.h:536
static float vdot(const float *b, const float *a, int n)
Definition: TCernLib.h:443
Double_t x[n]
Definition: legend1.C:17
#define ClassDef(name, id)
Definition: Rtypes.h:254
static float * trupck(const float *u, float *s, int m)
static float * trats(const float *a, const float *s, float *b, int m, int n)
static float * vmatl(const float *g, const float *c, float *x, int n=3, int m=3)
Definition: TCernLib.h:568
static float * mxmub(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:227
static float * trchul(const float *a, float *b, int n)
static float * trata(const float *a, float *r, int m, int n)
ROOT::R::TRInterface & r
Definition: Object.C:4
static float * mxmpy(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:203
static int * ucopy(const int *a, int *b, int n)
Definition: TCernLib.h:352
TMarker * m
Definition: textangle.C:8
static float * tral(const float *a, const float *u, float *b, int m, int n)
Triangular - Rectangular Multiplication CERN PROGLIB# F112 TRAL .VERSION KERNFOR 4.15 861204 ORIG.
Definition: TCernLib.cxx:354
static float * mxmpy2(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:215
static float * trasat(const float *a, const float *s, float *r, int m, int n)
static float * mxmub3(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:245
static float * tralt(const float *a, const float *u, float *b, int m, int n)
static float * mxmlrt_0_(int n__, const float *a, const float *b, float *c, int ni, int nj)
Matrix Multiplication CERN PROGLIB# F110 MXMLRT .VERSION KERNFOR 2.00 720707 ORIG.
Definition: TCernLib.cxx:161
static float * vzero(float *a, int n2)
Definition: TCernLib.h:512
static float * traat(const float *a, float *s, int m, int n)
static float * vadd(const float *b, const float *c, float *a, int n)
Definition: TCernLib.h:407
static float * mxmad1(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:185
virtual ~TCL()
Definition: TCernLib.h:37
Array of doubles (64 bits per element).
Definition: TArrayD.h:29
static float * trqsq(const float *q, const float *s, float *r, int m)
static float * mxmub1(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:233
static float * vcopyn(const float *a, float *x, int n)
Definition: TCernLib.h:495
static float * vlinco(const float *a, float fa, const float *b, float fb, float *x, int n)
Definition: TCernLib.h:552
static float * mxmub2(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:239
static float * mxmad(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:179
static float * trsinv(const float *g, float *gi, int n)
static float * vsub(const float *a, const float *b, float *x, int n)
Definition: TCernLib.h:461
float * q
Definition: THbookFile.cxx:87
const Int_t n
Definition: legend1.C:16
static float * mxmad3(const float *a, const float *b, float *c, int i, int j, int k)
Definition: TCernLib.h:197