📄 util.c
字号:
}/************************************************************************** These functions return the index of the maximum element in a vector**************************************************************************/int idxamax_strd(int n, idxtype *x, int incx){ int i, max=0; n *= incx; for (i=incx; i<n; i+=incx) max = (x[i] > x[max] ? i : max); return max/incx;}/************************************************************************** These functions return the index of the maximum element in a vector**************************************************************************/int samax(int n, float *x){ int i, max=0; for (i=1; i<n; i++) max = (x[i] > x[max] ? i : max); return max;}/************************************************************************** These functions return the index of the almost maximum element in a vector**************************************************************************/int samax2(int n, float *x){ int i, max1, max2; if (x[0] > x[1]) { max1 = 0; max2 = 1; } else { max1 = 1; max2 = 0; } for (i=2; i<n; i++) { if (x[i] > x[max1]) { max2 = max1; max1 = i; } else if (x[i] > x[max2]) max2 = i; } return max2;}/************************************************************************** These functions return the index of the minimum element in a vector**************************************************************************/int idxamin(int n, idxtype *x){ int i, min=0; for (i=1; i<n; i++) min = (x[i] < x[min] ? i : min); return min;}/************************************************************************** These functions return the index of the minimum element in a vector**************************************************************************/int samin(int n, float *x){ int i, min=0; for (i=1; i<n; i++) min = (x[i] < x[min] ? i : min); return min;}/************************************************************************** This function sums the entries in an array**************************************************************************/int idxsum(int n, idxtype *x){ int i, sum = 0; for (i=0; i<n; i++) sum += x[i]; return sum;}/************************************************************************** This function sums the entries in an array**************************************************************************/int idxsum_strd(int n, idxtype *x, int incx){ int i, sum = 0; for (i=0; i<n; i++, x+=incx) { sum += *x; } return sum;}/************************************************************************** This function sums the entries in an array**************************************************************************/void idxadd(int n, idxtype *x, idxtype *y){ for (n--; n>=0; n--) y[n] += x[n];}/************************************************************************** This function sums the entries in an array**************************************************************************/int charsum(int n, char *x){ int i, sum = 0; for (i=0; i<n; i++) sum += x[i]; return sum;}/************************************************************************** This function sums the entries in an array**************************************************************************/int isum(int n, int *x){ int i, sum = 0; for (i=0; i<n; i++) sum += x[i]; return sum;}/************************************************************************** This function sums the entries in an array**************************************************************************/float ssum(int n, float *x){ int i; float sum = 0.0; for (i=0; i<n; i++) sum += x[i]; return sum;}/************************************************************************** This function sums the entries in an array**************************************************************************/float ssum_strd(int n, float *x, int incx){ int i; float sum = 0.0; for (i=0; i<n; i++, x+=incx) sum += *x; return sum;}/************************************************************************** This function sums the entries in an array**************************************************************************/void sscale(int n, float alpha, float *x){ int i; for (i=0; i<n; i++) x[i] *= alpha;}/************************************************************************** This function computes a 2-norm**************************************************************************/float snorm2(int n, float *v){ int i; float partial = 0; for (i = 0; i<n; i++) partial += v[i] * v[i]; return sqrt(partial);}/************************************************************************** This function computes a 2-norm**************************************************************************/float sdot(int n, float *x, float *y){ int i; float partial = 0; for (i = 0; i<n; i++) partial += x[i] * y[i]; return partial;}/************************************************************************** This function computes a 2-norm**************************************************************************/void saxpy(int n, float alpha, float *x, int incx, float *y, int incy){ int i; for (i=0; i<n; i++, x+=incx, y+=incy) *y += alpha*(*x);}/************************************************************************** This file randomly permutes the contents of an array.* flag == 0, don't initialize perm* flag == 1, set p[i] = i **************************************************************************/void RandomPermute(int n, idxtype *p, int flag){ int i, u, v; idxtype tmp; if (flag == 1) { for (i=0; i<n; i++) p[i] = i; } if (n <= 4) return; for (i=0; i<n; i+=16) { u = RandomInRangeFast(n-4); v = RandomInRangeFast(n-4); SWAP(p[v], p[u], tmp); SWAP(p[v+1], p[u+1], tmp); SWAP(p[v+2], p[u+2], tmp); SWAP(p[v+3], p[u+3], tmp); }}/************************************************************************** This function generates random initialization **************************************************************************/void RandomInit(int n, int k, idxtype *label){ int i, chunksize, j; idxtype tmp; int *p= imalloc(n, "Util: RandomInit\n"); RandomPermute(n, p, 1); chunksize = n / k +1; j=0; for (i=0; i<n; i++){ label[p[i]] = j; if ((i+1)% chunksize ==0) j++; } free (p);}/************************************************************************** This function returns true if the a is a power of 2**************************************************************************/int ispow2(int a){ for (; a%2 != 1; a = a>>1); return (a > 1 ? 0 : 1);}/************************************************************************** This function initializes the random number generator**************************************************************************/void InitRandom(int seed){ if (seed == -1) {#ifndef __VC__ srand48(7654321L); #endif srand(4321); } else {#ifndef __VC__ srand48(seed); #endif srand(seed); }}/************************************************************************** This function returns the log2(x)**************************************************************************/int log2(int a){ int i; for (i=1; a > 1; i++, a = a>>1); return i-1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -