spblas.cpp

来自「Gaussian Mixture Algorithm」· C++ 代码 · 共 764 行 · 第 1/2 页

CPP
764
字号
void idx_m1extm1(Idx<float> &a, spIdx<float> &x, spIdx<float> &y){	check_m2dotm1(a,y,x);	idx_clear(a);	intg *x_ptr1 = x.index()->idx_ptr(), *y_ptr1 = y.index()->idx_ptr();	intg x_mod1 = x.index()->mod(0), y_mod1 = y.index()->mod(0);	float *x_ptr2 = x.values()->idx_ptr(), *y_ptr2 = y.values()->idx_ptr();	intg x_mod2 = x.values()->mod(0), y_mod2 = y.values()->mod(0);	float *a_ptr = a.idx_ptr();	const intg *a_mod = a.mods();	for(intg i = 0; i < x.nelements(); i++){		intg i0 = *x_ptr1;		float ex = *x_ptr2;		intg* y_ptr21 = y_ptr1;		float* y_ptr22 = y_ptr2;		for(intg j = 0; j < y.nelements(); j++){			intg j0 = *y_ptr21;			float ey = *y_ptr22;			*(a_ptr + i0*a_mod[0] + j0*a_mod[1]) = ex*ey;			y_ptr21 += y_mod1;			y_ptr22 += y_mod2;		}		x_ptr1 += x_mod1;		x_ptr2 += x_mod2;	}}//! vector-vector outer product a <- a + x.y'void idx_m1extm1acc(spIdx<double> &a, spIdx<double> &x, spIdx<double> &y){	check_m2dotm1(a,y,x);	intg *x_ptr1 = x.index()->idx_ptr(), *y_ptr1 = y.index()->idx_ptr();	intg x_mod1 = x.index()->mod(0), y_mod1 = y.index()->mod(0);	double *x_ptr2 = x.values()->idx_ptr(), *y_ptr2 = y.values()->idx_ptr();	intg x_mod2 = x.values()->mod(0), y_mod2 = y.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++){		intg i0 = *x_ptr1;		double ex = *x_ptr2;		intg* y_ptr21 = y_ptr1;		double* y_ptr22 = y_ptr2;		for(intg j = 0; j < y.nelements(); j++){			intg j0 = *y_ptr21;			double ey = *y_ptr22;			a.set(a.get(i0, j0) + ex * ey, i0, j0);			y_ptr21 += y_mod1;			y_ptr22 += y_mod2;		}		x_ptr1 += x_mod1;		x_ptr2 += x_mod2;	}}void idx_m1extm1acc(spIdx<float> &a, spIdx<float> &x, spIdx<float> &y){	check_m2dotm1(a,y,x);	intg *x_ptr1 = x.index()->idx_ptr(), *y_ptr1 = y.index()->idx_ptr();	intg x_mod1 = x.index()->mod(0), y_mod1 = y.index()->mod(0);	float *x_ptr2 = x.values()->idx_ptr(), *y_ptr2 = y.values()->idx_ptr();	intg x_mod2 = x.values()->mod(0), y_mod2 = y.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++){		intg i0 = *x_ptr1;		float ex = *x_ptr2;		intg* y_ptr21 = y_ptr1;		float* y_ptr22 = y_ptr2;		for(intg j = 0; j < y.nelements(); j++){			intg j0 = *y_ptr21;			float ey = *y_ptr22;			a.set(a.get(i0, j0) + ex * ey, i0, j0);			y_ptr21 += y_mod1;			y_ptr22 += y_mod2;		}		x_ptr1 += x_mod1;		x_ptr2 += x_mod2;	}}//! square matrix vector multiplicationvoid idx_m2squdotm1(spIdx<double> &a, Idx<double> &x, Idx<double> &y){	check_m2dotm1(a,x,y);	idx_clear(y);	intg* myptr1 = a.index()->idx_ptr();	double *myptr2 = a.values()->idx_ptr();	const intg* mod1 = a.index()->mods(), mod2 = a.values()->mod(0);	double* x_ptr = x.idx_ptr(), *y_ptr = y.idx_ptr();	intg xmod = x.mod(0), ymod = y.mod(0);	for(intg i = 0; i < a.nelements(); i++){		intg lig = *myptr1;		intg col = *(myptr1+ mod1[1]);		*(y_ptr + lig * ymod) += (*myptr2) * (*myptr2) * *(x_ptr + col*xmod);		myptr1 += mod1[0]; myptr2 += mod2;	}}void idx_m2squdotm1(spIdx<float> &a, Idx<float> &x, Idx<float> &y){	check_m2dotm1(a,x,y);	idx_clear(y);	intg* myptr1 = a.index()->idx_ptr();	float *myptr2 = a.values()->idx_ptr();	const intg* mod1 = a.index()->mods(), mod2 = a.values()->mod(0);	float* x_ptr = x.idx_ptr(), *y_ptr = y.idx_ptr();	intg xmod = x.mod(0), ymod = y.mod(0);	for(intg i = 0; i < a.nelements(); i++){		intg lig = *myptr1;		intg col = *(myptr1+ mod1[1]);		*(y_ptr + lig * ymod) += (*myptr2) * (*myptr2) * *(x_ptr + col*xmod);		myptr1 += mod1[0]; myptr2 += mod2;	}}void idx_m2squdotm1(spIdx<double> &a, spIdx<double> &x, spIdx<double> &y){	check_m2dotm1(a,x,y);	idx_clear(y);	double inx[x.dim(0)];	double iny[x.dim(0)];	for(intg i = 0; i < x.dim(0); i++) { inx[i] = 0; iny[i] = 0; }	intg *x_ptr1 = x.index()->idx_ptr();	double *x_ptr2 = x.values()->idx_ptr();	const intg xmod1 = x.index()->mod(0), xmod2 = x.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++){		inx[*x_ptr1] = *x_ptr2;		x_ptr1 += xmod1; x_ptr2 += xmod2;	}	intg *a_ptr1 = a.index()->idx_ptr();	double *a_ptr2 = a.values()->idx_ptr();	const intg* amod1 = a.index()->mods(), amod2 = a.values()->mod(0);	for(intg i = 0; i < a.nelements(); i++){		intg lig = *a_ptr1;		intg col =*(a_ptr1+ amod1[1]);		iny[lig] += (*a_ptr2) * (*a_ptr2) * inx[col];		a_ptr1 += amod1[0]; a_ptr2 += amod2;	}	for(intg i = 0; i < x.dim(0); i++){		if(iny[i] != BACKGROUND) y.set(iny[i], i);	}}void idx_m2squdotm1(spIdx<float> &a, spIdx<float> &x, spIdx<float> &y){	check_m2dotm1(a,x,y);	idx_clear(y);	float inx[x.dim(0)];	float iny[x.dim(0)];	for(intg i = 0; i < x.dim(0); i++) { inx[i] = 0; iny[i] = 0; }	intg *x_ptr1 = x.index()->idx_ptr();	float *x_ptr2 = x.values()->idx_ptr();	const intg xmod1 = x.index()->mod(0), xmod2 = x.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++){		inx[*x_ptr1] = *x_ptr2;		x_ptr1 += xmod1; x_ptr2 += xmod2;	}	intg *a_ptr1 = a.index()->idx_ptr();	float *a_ptr2 = a.values()->idx_ptr();	const intg* amod1 = a.index()->mods(), amod2 = a.values()->mod(0);	for(intg i = 0; i < a.nelements(); i++){		intg lig = *a_ptr1;		intg col =*(a_ptr1+ amod1[1]);		iny[lig] += (*a_ptr2) * (*a_ptr2) * inx[col];		a_ptr1 += amod1[0]; a_ptr2 += amod2;	}	for(intg i = 0; i < x.dim(0); i++){		if(iny[i] != BACKGROUND) y.set(iny[i], i);	}}void idx_m2squdotm1acc(spIdx<double> &a, Idx<double> &x, Idx<double> &y){	check_m2dotm1(a,x,y);	intg* myptr1 = a.index()->idx_ptr();	double *myptr2 = a.values()->idx_ptr();	const intg* mod1 = a.index()->mods(), mod2 = a.values()->mod(0);	double* x_ptr = x.idx_ptr(), *y_ptr = y.idx_ptr();	intg xmod = x.mod(0), ymod = y.mod(0);	for(intg i = 0; i < a.nelements(); i++){		intg lig = *myptr1;		intg col = *(myptr1+ mod1[1]);		*(y_ptr + lig * ymod) += (*myptr2) * (*myptr2) * *(x_ptr + col*xmod);		myptr1 += mod1[0]; myptr2 += mod2;	}}void idx_m2squdotm1acc(spIdx<float> &a, Idx<float> &x, Idx<float> &y){	check_m2dotm1(a,x,y);	intg* myptr1 = a.index()->idx_ptr();	float *myptr2 = a.values()->idx_ptr();	const intg* mod1 = a.index()->mods(), mod2 = a.values()->mod(0);	float* x_ptr = x.idx_ptr(), *y_ptr = y.idx_ptr();	intg xmod = x.mod(0), ymod = y.mod(0);	for(intg i = 0; i < a.nelements(); i++){		intg lig = *myptr1;		intg col = *(myptr1+ mod1[1]);		*(y_ptr + lig * ymod) += (*myptr2) * (*myptr2) * *(x_ptr + col*xmod);		myptr1 += mod1[0]; myptr2 += mod2;	}}void idx_m2squdotm1acc(spIdx<double> &a, spIdx<double> &x, spIdx<double> &y){	check_m2dotm1(a,x,y);	double inx[x.dim(0)];	double iny[x.dim(0)];	for(intg i = 0; i < x.dim(0); i++) { inx[i] = 0; iny[i] = 0; }	intg *x_ptr1 = x.index()->idx_ptr();	double *x_ptr2 = x.values()->idx_ptr();	const intg xmod1 = x.index()->mod(0), xmod2 = x.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++) inx[*(x_ptr1 + i*xmod1)] = *(x_ptr2 + i*xmod2);	intg *a_ptr1 = a.index()->idx_ptr();	double *a_ptr2 = a.values()->idx_ptr();	const intg* amod1 = a.index()->mods(), amod2 = a.values()->mod(0);	for(intg i = 0; i < a.nelements(); i++){		intg lig = *a_ptr1;		intg col =*(a_ptr1 + amod1[1]);		iny[lig] += (*a_ptr2) * (*a_ptr2) * inx[col];		a_ptr1 += amod1[0]; a_ptr2 += amod2;	}	for(intg i = 0; i < x.dim(0); i++){		if(iny[i] != BACKGROUND) y.set(iny[i] + y.get(i), i);	}}void idx_m2squdotm1acc(spIdx<float> &a, spIdx<float> &x, spIdx<float> &y){	check_m2dotm1(a,x,y);	float inx[x.dim(0)];	float iny[x.dim(0)];	for(intg i = 0; i < x.dim(0); i++) { inx[i] = 0; iny[i] = 0; }	intg *x_ptr1 = x.index()->idx_ptr();	float *x_ptr2 = x.values()->idx_ptr();	const intg xmod1 = x.index()->mod(0), xmod2 = x.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++) inx[*(x_ptr1 + i*xmod1)] = *(x_ptr2 + i*xmod2);	intg *a_ptr1 = a.index()->idx_ptr();	float *a_ptr2 = a.values()->idx_ptr();	const intg* amod1 = a.index()->mods(), amod2 = a.values()->mod(0);	for(intg i = 0; i < a.nelements(); i++){		intg lig = *a_ptr1;		intg col =*(a_ptr1 + amod1[1]);		iny[lig] += (*a_ptr2) * (*a_ptr2) * inx[col];		a_ptr1 += amod1[0]; a_ptr2 += amod2;	}	for(intg i = 0; i < x.dim(0); i++){		if(iny[i] != BACKGROUND) y.set(iny[i] + y.get(i), i);	}}void idx_m1squextm1(spIdx<double> &a, spIdx<double> &x, spIdx<double> &y){	check_m2dotm1(a,y,x);	idx_clear(a);	intg *x_ptr1 = x.index()->idx_ptr(), *y_ptr1 = y.index()->idx_ptr();	intg x_mod1 = x.index()->mod(0), y_mod1 = y.index()->mod(0);	double *x_ptr2 = x.values()->idx_ptr(), *y_ptr2 = y.values()->idx_ptr();	intg x_mod2 = x.values()->mod(0), y_mod2 = y.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++){		intg i0 = *x_ptr1;		double ex = *x_ptr2;		intg* y_ptr21 = y_ptr1;		double* y_ptr22 = y_ptr2;		for(intg j = 0; j < y.nelements(); j++){			intg j0 = *y_ptr21;			double ey = *y_ptr22;			a.set(ex * ey * ey, i0, j0);			y_ptr21 += y_mod1;			y_ptr22 += y_mod2;		}		x_ptr1 += x_mod1;		x_ptr2 += x_mod2;	}}void idx_m1squextm1(spIdx<float> &a, spIdx<float> &x, spIdx<float> &y){	check_m2dotm1(a,y,x);	idx_clear(a);	intg *x_ptr1 = x.index()->idx_ptr(), *y_ptr1 = y.index()->idx_ptr();	intg x_mod1 = x.index()->mod(0), y_mod1 = y.index()->mod(0);	float *x_ptr2 = x.values()->idx_ptr(), *y_ptr2 = y.values()->idx_ptr();	intg x_mod2 = x.values()->mod(0), y_mod2 = y.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++){		intg i0 = *x_ptr1;		float ex = *x_ptr2;		intg* y_ptr21 = y_ptr1;		float* y_ptr22 = y_ptr2;		for(intg j = 0; j < y.nelements(); j++){			intg j0 = *y_ptr21;			float ey = *y_ptr22;			a.set(ex * ey * ey, i0, j0);			y_ptr21 += y_mod1;			y_ptr22 += y_mod2;		}		x_ptr1 += x_mod1;		x_ptr2 += x_mod2;	}}//! vector-vector outer product y <- y + x.x'void idx_m1squextm1acc(spIdx<double> &a, spIdx<double> &x, spIdx<double> &y){	check_m2dotm1(a,y,x);	intg *x_ptr1 = x.index()->idx_ptr(), *y_ptr1 = y.index()->idx_ptr();	intg x_mod1 = x.index()->mod(0), y_mod1 = y.index()->mod(0);	double *x_ptr2 = x.values()->idx_ptr(), *y_ptr2 = y.values()->idx_ptr();	intg x_mod2 = x.values()->mod(0), y_mod2 = y.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++){		intg i0 = *x_ptr1;		double ex = *x_ptr2;		intg* y_ptr21 = y_ptr1;		double* y_ptr22 = y_ptr2;		for(intg j = 0; j < y.nelements(); j++){			intg j0 = *y_ptr21;			double ey = *y_ptr22;			a.set(a.get(i0, j0) + ex * ey * ey, i0, j0);			y_ptr21 += y_mod1;			y_ptr22 += y_mod2;		}		x_ptr1 += x_mod1;		x_ptr2 += x_mod2;	}}void idx_m1squextm1acc(spIdx<float> &a, spIdx<float> &x, spIdx<float> &y){	check_m2dotm1(a,y,x);	intg *x_ptr1 = x.index()->idx_ptr(), *y_ptr1 = y.index()->idx_ptr();	intg x_mod1 = x.index()->mod(0), y_mod1 = y.index()->mod(0);	float *x_ptr2 = x.values()->idx_ptr(), *y_ptr2 = y.values()->idx_ptr();	intg x_mod2 = x.values()->mod(0), y_mod2 = y.values()->mod(0);	for(intg i = 0; i < x.nelements(); i++){		intg i0 = *x_ptr1;		float ex = *x_ptr2;		intg* y_ptr21 = y_ptr1;		float* y_ptr22 = y_ptr2;		for(intg j = 0; j < y.nelements(); j++){			intg j0 = *y_ptr21;			float ey = *y_ptr22;			a.set(a.get(i0, j0) + ex * ey * ey, i0, j0);			y_ptr21 += y_mod1;			y_ptr22 += y_mod2;		}		x_ptr1 += x_mod1;		x_ptr2 += x_mod2;	}}//! normalize the colums of a matrixvoid norm_columns(spIdx<double> &m){	double sums[8] = {0, 0, 0, 0, 0, 0, 0, 0};	double *vptr = m.values()->idx_ptr();	intg *iptr = m.index()->idx_ptr();	const intg *imods = m.index()->mods(), vmod = m.values()->mod(0);	for(intg i = 0; i < m.nelements(); i++){		intg col = *(iptr + imods[1]);		sums[col] += *vptr;		iptr += imods[0]; vptr += vmod;	}	vptr = m.values()->idx_ptr();	iptr = m.index()->idx_ptr();	for(intg i = 0; i < m.nelements(); i++){		intg col = *(iptr + imods[1]);		*vptr = *vptr / sums[col];		iptr += imods[0]; vptr += vmod;	}}void norm_columns(spIdx<float> &m){	float sums[8] = {0, 0, 0, 0, 0, 0, 0, 0};	float *vptr = m.values()->idx_ptr();	intg *iptr = m.index()->idx_ptr();	const intg *imods = m.index()->mods(), vmod = m.values()->mod(0);	for(intg i = 0; i < m.nelements(); i++){		intg col = *(iptr + imods[1]);		sums[col] += *vptr;		iptr += imods[0]; vptr += vmod;	}	vptr = m.values()->idx_ptr();	iptr = m.index()->idx_ptr();	for(intg i = 0; i < m.nelements(); i++){		intg col = *(iptr + imods[1]);		*vptr = *vptr / sums[col];		iptr += imods[0]; vptr += vmod;	}}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?