void SmartSpace::RandUnform(double start, double end) { NewMemoryOnWrite(); double ell = end - start; for (integer i = 0; i < length; i++) Space[i] = genrandreal() * ell + start; };
void SPDTVariable::RandInManifold(void) { integer n = elements[0]->Getsize()[0], num = numofelements; /*temp is an n by n matrix*/ double *temp = new double[n * n]; NewMemoryOnWrite(); for (integer k = 0; k < num; k++) { for (integer i = 0; i < n; i++) { for (integer j = 0; j < n; j++) { temp[j + i * n] = genrandnormal(); } } /*Space <-- temp * temp^T. Thus, Space points to a symmetric positive definite matrix. Therefore, this SPDVariable is a SPD matrix.*/ dgemm_(GLOBAL::N, GLOBAL::T, &n, &n, &n, &GLOBAL::DONE, temp, &n, temp, &n, &GLOBAL::DZERO, Space + k * n * n, &n); } delete[] temp; };
void SmartSpace::RandGaussian(double mean, double variance) { NewMemoryOnWrite(); for (integer i = 0; i < length; i++) Space[i] = (genrandnormal() + mean) * variance; };
double *SmartSpace::ObtainWriteEntireData(void) { NewMemoryOnWrite(); return Space; };
double *ProductElement::ObtainWriteEntireData(void) { NewMemoryOnWrite(); return Space; };