1 #ifndef MATH_FAST_ARRAY_H 2 #define MATH_FAST_ARRAY_H 9 inline T* array_create(
int n)
12 return (T*)malloc(
sizeof(T)*n);
17 inline void array_delete(T* v)
24 inline void array_equal(T* a,
const T* b,
int n)
26 for(
int i=0;i<n;i++,a++,b++)
31 inline T* array_copy(T* a,
int n)
33 T* x = array_create<T>(n);
39 inline void array_fill(T* a,
const T& c,
int n)
41 for(
int i=0;i<n;i++,a++)
46 inline void array_zero(T* a,
int n)
52 inline void array_negate(T* x,
const T* a,
int n)
54 for(
int i=0;i<n;i++,x++,a++)
59 inline void array_add(T* x,
const T* a,
const T* b,
int n)
61 for(
int i=0;i<n;i++,x++,a++,b++)
66 inline void array_sub(T* x,
const T* a,
const T* b,
int n)
68 for(
int i=0;i<n;i++,x++,a++,b++)
73 inline void array_mul(T* x,
const T* a, T s,
int n)
75 for(
int i=0;i<n;i++,x++,a++)
80 inline void array_div(T* x,
const T* a, T s,
int n)
82 for(
int i=0;i<n;i++,x++,a++)
87 inline void array_acc(T* x,
const T* a,
int n)
89 for(
int i=0;i<n;i++,x++,a++)
94 inline void array_dec(T* x,
const T* a,
int n)
96 for(
int i=0;i<n;i++,x++,a++)
101 inline void array_madd(T* x,
const T* a,
const T& s,
int n)
103 for(
int i=0;i<n;i++,x++,a++)
108 inline void array_axpby(T* z, T a,
const T* x, T b,
const T* y,
int n)
110 for(
int i=0;i<n;i++,z++,x++,y++)
111 *z = a*(*x) + b*(*y);
115 inline void array_mul(T* a,
const T& s,
int n)
117 for(
int i=0;i<n;i++,a++)
122 inline void array_div(T* a,
const T& s,
int n)
124 for(
int i=0;i<n;i++,a++)
129 inline T array_sum_product(
const T* a,
const T* b,
int n)
132 for(
int i=0;i<n;i++,a++,b++)
138 inline T array_dot(
const T* a,
const T* b,
int n)
141 for(
int i=0;i<n;i++,a++,b++)
147 inline T array_norm_squared(
const T* a,
int n)
150 for(
int i=0;i<n;i++,a++)
158 inline void gen_array_fill(T* x,
int xstride, T c,
int n)
160 for(
int i=0;i<n;i++,x+=xstride)
165 inline void gen_array_mul(T* x,
int xstride, T c,
int n)
167 for(
int i=0;i<n;i++,x+=xstride)
172 inline void gen_array_div(T* x,
int xstride, T c,
int n)
174 for(
int i=0;i<n;i++,x+=xstride)
179 inline void gen_array_negate(T* x,
int xstride,
const T* a,
int astride,
int n)
181 for(
int i=0;i<n;i++,x+=xstride,a+=astride)
186 inline void gen_array_equal(T* x,
int xstride,
const T* a,
int astride,
int n)
188 for(
int i=0;i<n;i++,x+=xstride,a+=astride)
193 inline void gen_array_swap(T* x,
int xstride, T* y,
int ystride,
int n)
196 for(
int i=0;i<n;i++,x+=xstride,y+=ystride) {
204 inline void gen_array_mul(T* x,
int xstride,
const T* a,
int astride, T c,
int n)
206 for(
int i=0;i<n;i++,x+=xstride,a+=astride)
211 inline void gen_array_div(T* x,
int xstride,
const T* a,
int astride, T c,
int n)
213 for(
int i=0;i<n;i++,x+=xstride,a+=astride)
218 inline void gen_array_add(T* x,
int xstride,
const T* a,
int astride,
const T* b,
int bstride,
int n)
220 for(
int i=0;i<n;i++,x+=xstride,a+=astride,b+=bstride)
225 inline void gen_array_sub(T* x,
int xstride,
const T* a,
int astride,
const T* b,
int bstride,
int n)
227 for(
int i=0;i<n;i++,x+=xstride,a+=astride,b+=bstride)
232 inline void gen_array_acc(T* x,
int xstride,
const T* a,
int astride,
int n)
234 for(
int i=0;i<n;i++,x+=xstride,a+=astride)
239 inline void gen_array_dec(T* x,
int xstride,
const T* a,
int astride,
int n)
241 for(
int i=0;i<n;i++,x+=xstride,a+=astride)
246 inline void gen_array_madd(T* x,
int xstride,
const T* a,
int astride, T s,
int n)
248 for(
int i=0;i<n;i++,x+=xstride,a+=astride)
253 inline void gen_array_axpby(T* z,
int zstride, T a,
const T* x,
int xstride, T b,
const T* y,
int ystride,
int n)
255 for(
int i=0;i<n;i++,z+=zstride,x+=xstride,y+=ystride)
260 inline T gen_array_sum_product(
const T* a,
int astride,
const T* b,
int bstride,
int n)
263 for(
int i=0;i<n;i++,a+=astride,b+=bstride)
269 inline T gen_array_dot(
const T* a,
int astride,
const T* b,
int bstride,
int n)
272 for(
int i=0;i<n;i++,a+=astride,b+=bstride)
278 inline T gen_array_norm_squared(
const T* a,
int astride,
int n)
281 for(
int i=0;i<n;i++,a+=astride)
292 inline T** array2d_create(
int m,
int n)
298 int ofs = m*
sizeof(T*);
299 array = (T**)malloc(m*
sizeof(T*) + m*n*
sizeof(T));
300 unsigned char* bytes = (
unsigned char*) array;
305 array[i] = (T*)((bytes + ofs) + i*n*(
sizeof(T)));
313 inline void array2d_delete(T** v)
322 inline void array2d_fill(T** X,
const T& c,
int m,
int n)
324 array_fill(X[0], c, m*n);
329 inline void array2d_identity(T** X,
int m,
int n)
331 array_zero(X[0], m*n);
332 gen_array_fill(X[0],n+1,One,::Min(m,n));
338 inline void array2d_equal(T** X, T**
const A,
int m,
int n)
340 array_equal(X[0],A[0],m*n);
345 inline T** array2d_copy(T** A,
int m,
int n)
347 T** X = array2d_create<T>(m,n);
348 array2d_equal(X,A,m,n);
354 inline void array2d_transpose(T** X, T**
const A,
int m,
int n)
358 gen_array_equal(X[i],1,&A[0][i],m,n);
367 inline void array2d_add(T** x, T**
const a, T**
const b,
int m,
int n)
369 array_add(x[0],a[0],b[0],m*n);
374 inline void array2d_sub(T** x, T**
const a, T**
const b,
int m,
int n)
376 array_sub(x[0],a[0],b[0],m*n);
381 inline void array2d_mul(T** x, T**
const a, T**
const b,
int m,
int n,
int p)
388 x[i][j] = gen_array_sum_product(a[i],1,&b[0][j],p,n);
400 inline void array2d_multiply_transposeA(T** x, T**
const a, T**
const b,
int m,
int n,
int p)
407 x[i][j] = gen_array_sum_product(&a[0][i],m,&b[0][j],p,n);
419 inline void array2d_multiply_transposeB(T** x, T**
const a, T**
const b,
int m,
int n,
int p)
431 x[i][j] = array_sum_product(a[i],b[j],n);
438 inline void array2d_vector_multiply(T* x, T**
const a,
const T* b,
int m,
int n)
442 x[i] = array_sum_product(a[i],b,n);
447 inline void array2d_vector_multiply_transpose(T* x, T**
const a,
const T* b,
int m,
int n)
458 x[i] = gen_array_sum_product(&a[0][i],n,b,1,m);
463 inline void array2d_vector_madd(T* x, T**
const a,
const T* b,
int m,
int n)
467 x[i] += array_sum_product(a[i],b,n);
472 inline void array2d_vector_madd_transpose(T* x, T**
const a,
const T* b,
int m,
int n)
481 x[i] += gen_array_sum_product(&a[0][i],n,b,1,m);
486 inline T array2d_row_dot(T**
const a,
int i,
const T* v,
int m,
int n)
488 return array_dot(a[i], v, n);
493 inline T array2d_col_dot(T**
const a,
int i,
const T* v,
int m,
int n)
495 gen_array_dot(&a[0][i],n,v,1,m);
501 inline T* gen_array2d_entry(T* X,
int xis,
int xjs,
int i,
int j)
503 return X+xis*i+xjs*j;
508 inline T* gen_array2d_row(T* X,
int xis,
int xjs,
int i)
515 inline T* gen_array2d_col(T* X,
int xis,
int xjs,
int j)
522 inline void gen_array2d_fill(T* X,
int xis,
int xjs,
const T& c,
int m,
int n)
524 for(
int i=0;i<m;i++,X+=xis)
525 gen_array_fill(X,xjs,c,n);
530 inline void gen_array2d_identity(T* X,
int xis,
int xjs,
int m,
int n)
532 gen_array2d_fill(X,xis,xjs,T(0),m,n);
533 gen_array_fill(X,xis+xjs,T(1),m);
539 inline void gen_array2d_equal(T* X,
int xis,
int xjs,
540 const T* A,
int ais,
int ajs,
int m,
int n)
542 for(
int i=0;i<m;i++,X+=xis,A+=ais)
543 gen_array_equal(X,xjs,A,ajs,n);
548 inline void gen_array2d_transpose(T* X,
int xis,
int xjs,
549 const T* A,
int ais,
int ajs,
int m,
int n)
551 gen_array2d_equal(X,xis,xjs,A,ajs,ais,m,n);
556 inline void gen_array2d_add(T* X,
int xis,
int xjs,
557 const T* A,
int ais,
int ajs,
558 const T* B,
int bis,
int bjs,
int m,
int n)
560 for(
int i=0;i<m;i++,X+=xis,A+=ais,B+=bis) {
561 gen_array_add(X,xjs,A,ajs,B,bjs,n);
567 inline void gen_array2d_sub(T* X,
int xis,
int xjs,
568 const T* A,
int ais,
int ajs,
569 const T* B,
int bis,
int bjs,
int m,
int n)
571 for(
int i=0;i<m;i++,X+=xis,A+=ais,B+=bis) {
572 gen_array_sub(X,xjs,A,ajs,B,bjs,n);
578 inline void gen_array2d_mul(T* X,
int xis,
int xjs,
579 const T* A,
int ais,
int ajs,
580 const T& c,
int m,
int n)
582 for(
int i=0;i<m;i++,X+=xis,A+=ais)
583 gen_array_mul(X,xjs,A,ajs,c,n);
588 inline void gen_array2d_mul(T* X,
int xis,
int xjs,
589 const T& c,
int m,
int n)
591 for(
int i=0;i<m;i++,X+=xis)
592 gen_array_mul(X,xjs,c,n);
597 inline void gen_array2d_div(T* X,
int xis,
int xjs,
598 const T& c,
int m,
int n)
600 for(
int i=0;i<m;i++,X+=xis)
601 gen_array_div(X,xjs,c,n);
607 inline void gen_array2d_acc(T* X,
int xis,
int xjs,
608 const T* A,
int ais,
int ajs,
611 for(
int i=0;i<m;i++,X+=xis,A+=ais) {
612 gen_array_acc(X,xjs,A,ajs,n);
618 inline void gen_array2d_dec(T* X,
int xis,
int xjs,
619 const T* A,
int ais,
int ajs,
622 for(
int i=0;i<m;i++,X+=xis,A+=ais) {
623 gen_array_dec(X,xjs,A,ajs,n);
629 inline void gen_array2d_madd(T* X,
int xis,
int xjs,
630 const T* A,
int ais,
int ajs,
634 for(
int i=0;i<m;i++,X+=xis,A+=ais) {
635 gen_array_madd(X,xjs,A,ajs,c,n);
641 inline void gen_array2d_negate(T* X,
int xis,
int xjs,
642 const T* A,
int ais,
int ajs,
645 for(
int i=0;i<m;i++,X+=xis,A+=ais) {
646 gen_array_negate(X,xjs,A,ajs,n);
652 inline void gen_array2d_multiply(T* X,
int xis,
int xjs,
653 const T* A,
int ais,
int ajs,
654 const T* B,
int bis,
int bjs,
659 for(i=0;i<m;i++, X+=xis,A+=ais)
663 for(j=0;j<p;j++, Xi+=xjs,Bj+=bjs)
668 for(k=0;k<n;k++, Aij+=ajs,Bij+=bis)
669 sum += (*Aij)*(*Bij);
679 inline void gen_array2d_multiply_transposeA(T* X,
int xis,
int xjs,
680 const T* A,
int ais,
int ajs,
681 const T* B,
int bis,
int bjs,
684 gen_array2d_multiply(X,xis,xjs,
692 inline void gen_array2d_multiply_transposeB(T* X,
int xis,
int xjs,
693 const T* A,
int ais,
int ajs,
694 const T* B,
int bis,
int bjs,
697 gen_array2d_multiply(X,xis,xjs,
705 inline void gen_array2d_vector_multiply(T* x,
int xs,
706 const T* A,
int ais,
int ajs,
710 for(
int i=0;i<m;i++, x+=xs,A+=ais)
711 *x = gen_array_sum_product(A,ajs, b,bs, n);
716 inline void gen_array2d_vector_multiply_transpose(T* x,
int xs,
717 const T* A,
int ais,
int ajs,
721 gen_array2d_vector_multiply(x,xs,A,ajs,ais,b,bs,n,m);
726 inline void gen_array2d_vector_madd(T* x,
int xs,
727 const T* A,
int ais,
int ajs,
731 for(
int i=0;i<m;i++, x+=xs,A+=ais)
732 *x += gen_array_sum_product(A,ajs, b,bs, n);
737 inline void gen_array2d_vector_madd_transpose(T* x,
int xs,
738 const T* A,
int ais,
int ajs,
742 gen_array2d_vector_madd(x,xs,A,ajs,ais,b,bs,n,m);
Utilities commonly used throughout a program.
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12