//vdSub		Subtraction of vector elements
void klVSLSub(klVector<double>& v,klVector<double>& b, klVector<double>& ans)
{
	vmlSetMode( VML_LA | VML_FTZDAZ_ON | VML_ERRMODE_ERRNO );
	if(v.getColumns() != b.getColumns() )
	{
		ANSI_INFO; throw klError(err + "Range Argument Exception in klVSLSub");
	}
	const __int64_t n = v.getColumns();

	vdSub( n,  v.getMemory(),b.getMemory(),ans.getMemory());

}
Esempio n. 2
0
 /*
  * Class:     com_intel_analytics_bigdl_mkl_MKL
  * Method:    vdSub
  * Signature: (I[DI[DI[DI)V
  */
JNIEXPORT void JNICALL Java_com_intel_analytics_bigdl_mkl_MKL_vdSub
   (JNIEnv * env, jclass cls, jint n, jdoubleArray a, jint aOffset, jdoubleArray b,
   jint bOffset, jdoubleArray y, jint yOffset) {

   jdouble * jni_a = (*env)->GetPrimitiveArrayCritical(env, a, JNI_FALSE);
   jdouble * jni_b = (*env)->GetPrimitiveArrayCritical(env, b, JNI_FALSE);
   jdouble * jni_y = (*env)->GetPrimitiveArrayCritical(env, y, JNI_FALSE);

   vdSub( n, jni_a + aOffset, jni_b + bOffset, jni_y + yOffset);

   (*env)->ReleasePrimitiveArrayCritical(env, y, jni_y, 0);
   (*env)->ReleasePrimitiveArrayCritical(env, b, jni_b, 0);
   (*env)->ReleasePrimitiveArrayCritical(env, a, jni_a, 0);
}
Esempio n. 3
0
void caffe_sub<double>(const int n, const double* a, const double* b,
                       double* y) {
    vdSub(n, a, b, y);
}
// -------------------------------  mexFunction ---------------------------------------//
void mexFunction( int nlhs, mxArray *plhs[],
		int nrhs, const mxArray *prhs[]) {

	/* Check for proper number of arguments */
	if(nrhs!=5) {
		Usage();
		mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs",
				"Five inputs required.");
	}
	if(nlhs!=4) {
		Usage();
		mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs",
				"Four output required.");
	}

	// Input argument and dimensions
	const mwSize 	DataR = mxGetM(prhs[0]),
					DataC = mxGetN(prhs[0]),
					MeanIR = mxGetM(prhs[1]),
					MeanIC = mxGetN(prhs[1]);
	const double 	*Data = mxGetPr(prhs[0]),
					*MeanI = mxGetPr(prhs[1]);
	const double 	MaxIter = mxGetScalar(prhs[2]),
					Thresh = mxGetScalar(prhs[3]);
	const int 		Verbose = (int) mxGetScalar(prhs[4]);


	// Set the number of means elements, dimension and number of data points
	int 	NM = MeanIC,
			ND = DataC,
			Dim = DataR;

	// Check appropriate sizes and modes
	if( Dim != MeanIR ) {
		Usage();
		mexErrMsgIdAndTxt("KMeans:Means","Means matrix dimension");
	}

	// Data elements
	double 	*Prior = NULL,
			*Mean = NULL,
			*Cov = NULL,
			*Assign;

	// ** KM parameters
	double	*SqrTemp = new double[Dim];
	double  *DistTemp = new double[NM];
	double	alpha = 1,
			beta = 1,
			Scale = 0;
	double  Term, TermP = 0;
	int     AssignTemp;
	int		*AssignNum; AssignNum = new int[NM];
	mwSize	CSize[] = {Dim,Dim,NM};
	int     CNumSize = 3;
	int 	i,k,j;
	int		inc = 1;
	int 	index = 0;

	Assign = new double[ND];
	Prior = new double[NM];
	Mean = new double[Dim*NM];
	Cov = new double[Dim*Dim*NM];

	memcpy(Mean, MeanI, Dim*NM*sizeof(double));

	for(int E = 0; E < MaxIter; E++){

		// ** Assign features to each center
#pragma omp parallel for shared(Data, Mean, Dim, inc, Assign) private(i,j, SqrTemp, DistTemp, AssignTemp)
		for(i = 0; i < ND; i++){
			for(j = 0; j < NM; j++){

				// Calculate elements of Data-Mean
				vdSub( Dim, &Data[i*Dim], &Mean[j*Dim], SqrTemp );

				// Square elements
				vdSqr( Dim, SqrTemp, SqrTemp );

				// Sum distances
				DistTemp[j] = dasum( &Dim, SqrTemp, &inc);
			}

			// Find minimum distance index
			AssignTemp = idamin(&NM, DistTemp, &inc);

			Assign[i] = double(AssignTemp-1);
		}

		// ** Calculate new center values
		// Zero out centers
		memset(Mean, 0, Dim*NM*sizeof(double));
		memset(AssignNum, 0, NM*sizeof(int));

		for(i = 0; i < ND; i++){
			index = Assign[i];
			daxpy(&Dim, &alpha, &Data[i*Dim], &inc, &Mean[index*Dim], &inc);
			AssignNum[index] = AssignNum[index] + 1;
		}

		for(i = 0; i < NM; i++){

			// If no point was assigned to an average, assign a different point
			if(AssignNum[i] == 0){
				memcpy(&Mean[i*Dim], &Data[(rand()%ND)*Dim], Dim*sizeof(double));
				Scale = 1;
				dscal(&Dim, &Scale, &Mean[i*Dim], &inc);
			}
			else{
				Scale = 1 / double(AssignNum[i]);
				dscal(&Dim, &Scale, &Mean[i*Dim], &inc);
			}
		}

		// Termination conditions
		k = Dim*NM;
		Term = dasum(&k, Mean, &inc);

		if(Verbose == 1){
			printf("Iteration %d - Shift %3.9f\n",E, fabs(Term-TermP));
			mexEvalString("pause(.000001);");
		}

		if(fabs(Term-TermP) <= Thresh)
			break;

		TermP = Term;
	}


	// ** Create and assign output variables
	double *Out;
	plhs[0] = mxCreateDoubleMatrix(1, ND ,mxREAL );
	plhs[1] = mxCreateDoubleMatrix(Dim, NM, mxREAL );
	plhs[2] = mxCreateDoubleMatrix(1, NM, mxREAL );
	plhs[3] = mxCreateNumericArray( CNumSize, CSize,
			mxDOUBLE_CLASS, mxREAL);

	// Priors
	k = 0;
	for(i = 0; i < NM; i++ )
		k = k + AssignNum[i];

	for(i = 0; i < NM; i++){
		Prior[i] = double(AssignNum[i])/k;
	}

	// Covariances
	memset(Cov, 0, Dim*Dim*NM*sizeof(double));
	char trans = 'N';
	k = 1;
	for(i = 0; i < ND; i++){

		index = Assign[i];
		Scale = 1/(Prior[index]*ND);

		// Calculate elements of Data-Mean
		vdSub( Dim, &Data[i*Dim], &Mean[index*Dim], SqrTemp );

		// covariance
		dgemm(&trans, &trans, &Dim, &Dim, &k, &Scale, SqrTemp, &Dim, SqrTemp,
				&k, &beta, &Cov[index*Dim*Dim], &Dim);

	}

	Out = mxGetPr(plhs[0]);
	memcpy(Out, Assign, ND*sizeof(double));
	Out = mxGetPr(plhs[1]);
	memcpy(Out, Mean, Dim*NM*sizeof(double));
	Out = mxGetPr(plhs[2]);
	memcpy(Out, Prior, NM*sizeof(double));
	Out = mxGetPr(plhs[3]);
	memcpy(Out, Cov, Dim*Dim*NM*sizeof(double));

	//** Delete dynamic variables
	delete [] Prior;
	delete [] Mean;
	delete [] Cov;
	delete [] Assign;
	delete [] AssignNum;

}
DLLEXPORT void d_vector_subtract( const int n, const double x[], const double y[], double result[] ){
	vdSub( n, x, y, result );
}