ROOT  6.07/01
Reference Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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; memcpy(a,b,n*sizeof(int)); return a;
356 }
357 
358 //________________________________________________________
359 inline float *TCL::ucopy(const float *b, float *a, int n)
360 {
361  //to be documented
362  if (n <= 0) return 0; memcpy(a,b,n*sizeof(float)); return a;
363 }
364 
365 //________________________________________________________
366 inline float *TCL::ucopy(const double *b, float *a, int n)
367 {
368  //to be documented
369  if (n <= 0) return 0;
370  for (int i=0;i<n;i++,a++,b++) *a = float(*b);
371  return a;
372 }
373 
374 //________________________________________________________
375 inline double *TCL::ucopy(const float *b, double *a, int n)
376 {
377  //to be documented
378  if (n <= 0) return 0;
379  for (int i=0;i<n;i++,a++,b++) *a = double(*b);
380  return a;
381 }
382 
383 //________________________________________________________
384 inline double *TCL::ucopy(const double *b, double *a, int n)
385 {
386  //to be documented
387  if (n <= 0) return 0; memcpy(a,b,n*sizeof(double)); return a;
388 }
389 
390 //________________________________________________________
391 inline void **TCL::ucopy(const void **b, void **a, int n)
392 {
393  //to be documented
394  if (n <= 0) return 0; memcpy(a,b,n*sizeof(void *)); return a;
395 }
396 
397 
398 //________________________________________________________
399 inline float *TCL::vadd(const float *b, const float *c, float *a, int n)
400 {
401  //to be documented
402  if (n <= 0) return 0;
403  for (int i=0;i<n;i++) a[i] = b[i] + c[i];
404  return a;
405 }
406 
407 //________________________________________________________
408 inline double *TCL::vadd(const double *b, const double *c, double *a, int n)
409 {
410  //to be documented
411  if (n <= 0) return 0;
412  for (int i=0;i<n;i++) a[i] = b[i] + c[i];
413  return a;
414 }
415 
416 //________________________________________________________
417 inline float *TCL::vadd(const float *b, const double *c, float *a, int n)
418 {
419  //to be documented
420  if (n <= 0) return 0;
421  for (int i=0;i<n;i++) a[i] = b[i] + c[i];
422  return a;
423 }
424 
425 //________________________________________________________
426 inline double *TCL::vadd(const double *b, const float *c, double *a, int n)
427 {
428  //to be documented
429  if (n <= 0) return 0;
430  for (int i=0;i<n;i++) a[i] = b[i] + c[i];
431  return a;
432 }
433 
434 //________________________________________________________
435 inline float TCL::vdot(const float *b, const float *a, int n)
436 {
437  //to be documented
438  float x=0;
439  if (n>0)
440  for (int i=0;i<n;i++,a++,b++) x += (*a) * (*b);
441  return x;
442 }
443 //________________________________________________________
444 inline double TCL::vdot(const double *b, const double *a, int n)
445 {
446  //to be documented
447  double x=0;
448  if (n>0)
449  for (int i=0;i<n;i++,a++,b++) x += (*a) * (*b);
450  return x;
451 }
452 //________________________________________________________
453 inline float *TCL::vsub(const float *a, const float *b, float *x, int n)
454 {
455  //to be documented
456  if (n <= 0) return 0;
457  for (int i=0;i<n;i++) x[i] = a[i]-b[i];
458  return x;
459 }
460 
461 //________________________________________________________
462 inline double *TCL::vsub(const double *a, const double *b, double *x, int n)
463 {
464  //to be documented
465  if (n <= 0) return 0;
466  for (int i=0;i<n;i++) x[i] = a[i]-b[i];
467  return x;
468 }
469 //________________________________________________________
470 inline float *TCL::vsub(const float *b, const double *c, float *a, int n)
471 {
472  //to be documented
473  if (n <= 0) return 0;
474  for (int i=0;i<n;i++) a[i] = b[i] - c[i];
475  return a;
476 }
477 
478 //________________________________________________________
479 inline double *TCL::vsub(const double *b, const float *c, double *a, int n)
480 {
481  //to be documented
482  if (n <= 0) return 0;
483  for (int i=0;i<n;i++) a[i] = b[i] - c[i];
484  return a;
485 }
486 //________________________________________________________
487 inline float *TCL::vcopyn(const float *a, float *x, int n)
488 {
489  //to be documented
490  if (n <= 0) return 0;
491  for (int i=0;i<n;i++) x[i] = -a[i];
492  return x;
493 }
494 //________________________________________________________
495 inline double *TCL::vcopyn(const double *a, double *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 //________________________________________________________
504 inline float *TCL::vzero(float *a, int n1)
505 {
506  //to be documented
507  if (n1 <= 0) return 0;
508  return (float *)memset(a,0,n1*sizeof(float));
509 }
510 
511 //________________________________________________________
512 inline double *TCL::vzero(double *a, int n1)
513 {
514  //to be documented
515  if (n1 <= 0) return 0;
516  return (double *)memset(a,0,n1*sizeof(double));
517 }
518 
519 //________________________________________________________
520 inline void **TCL::vzero(void **a, int n1)
521 {
522  //to be documented
523  if (n1 <= 0) return 0;
524  return (void **)memset(a,0,n1*sizeof(void *));
525 }
526 
527 //________________________________________________________
528 inline float *TCL::vscale(const float *a, float scale, float *b, int n)
529 {
530  //to be documented
531  for (int i=0;i<n;i++) b[i]=scale*a[i];
532  return b;
533 }
534 
535 //________________________________________________________
536 inline double *TCL::vscale(const double *a, double scale, double *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 float *TCL::vlinco(const float *a, float fa, const float *b, float fb, float *x, int n)
545 {
546  //to be documented
547  for (int i=0;i<n;i++){x[i]=a[i]*fa+b[i]*fb;};
548  return x;
549 }
550 
551 //________________________________________________________
552 inline double *TCL::vlinco(const double *a, double fa, const double *b, double fb,double *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 float *TCL::vmatl(const float *G, const float *c, float *x, int n,int m)
561 {
562  // x = G*c
563  for (int i=0; i<n; i++) {
564  double sum = 0;
565  for (int j=0; j<m; j++) sum += G[j + m*i]*c[j];
566  x[i] = sum;
567  }
568  return x;
569 }
570 
571 //_____________________________________________________________________________
572 inline double *TCL::vmatl(const double *G, const double *c, double *x, int n,int m)
573 {
574  // x = G*c
575  for (int i=0; i<n; i++) {
576  double sum = 0;
577  for (int j=0; j<m; j++) sum += G[j + m*i]*c[j];
578  x[i] = sum;
579  }
580  return x;
581 }
582 
583 //_____________________________________________________________________________
584 inline float *TCL::vmatr(const float *c, const float *G, float *x, int n,int m)
585 {
586  // x = c*G
587  for (int j=0; j<m; j++) {
588  double sum = 0;
589  for (int i=0; i<n; i++) sum += G[j + n*i]*c[i];
590  x[j] = sum;
591  }
592  return x;
593 }
594 
595 //_____________________________________________________________________________
596 inline double *TCL::vmatr(const double *c, const double *G, double *x, int n,int m)
597 {
598  // x = c*G
599  for (int j=0; j<m; j++) {
600  double sum = 0;
601  for (int i=0; i<n; i++) sum += G[j + n*i]*c[i];
602  x[j] = sum;
603  }
604  return x;
605 }
606 
607 #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)
return c
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:584
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:528
static float vdot(const float *b, const float *a, int n)
Definition: TCernLib.h:435
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:560
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)
TThread * t[5]
Definition: threadsh1.C:13
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:504
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:399
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:487
static float * vlinco(const float *a, float fa, const float *b, float fb, float *x, int n)
Definition: TCernLib.h:544
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:453
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