GURLS_EXPORT void svd(const gMat2D<float>& A, gMat2D<float>& U, gVec<float>& W, gMat2D<float>& Vt) { float* Ubuf; float* Sbuf; float* Vtbuf; int Urows, Ucols; int Slen; int Vtrows, Vtcols; gurls::svd(A.getData(), Ubuf, Sbuf, Vtbuf, A.rows(), A.cols(), Urows, Ucols, Slen, Vtrows, Vtcols); U.resize(Urows, Ucols); copy(U.getData(), Ubuf, U.getSize()); W.resize(Slen); copy(W.getData(), Sbuf, Slen); Vt.resize(Vtrows, Vtcols); copy(Vt.getData(), Vtbuf, Vt.getSize()); delete [] Ubuf; delete [] Sbuf; delete [] Vtbuf; }
GURLS_EXPORT void eig(const gMat2D<float>& A, gVec<float>& Wr, gVec<float>& Wi) { if (A.cols() != A.rows()) throw gException("The input matrix A must be squared"); float* Atmp = new float[A.getSize()]; copy(Atmp, A.getData(), A.getSize()); char jobvl = 'N', jobvr = 'N'; int n = A.cols(), lda = A.cols(), ldvl = 1, ldvr = 1; int info, lwork = 4*n; float* work = new float[lwork]; sgeev_(&jobvl, &jobvr, &n, Atmp, &lda, Wr.getData(), Wi.getData(), NULL, &ldvl, NULL, &ldvr, work, &lwork, &info); delete[] Atmp; delete[] work; if(info != 0) { std::stringstream str; str << "Eigenvalues/eigenVectors computation failed, error code " << info << ";" << std::endl; throw gException(str.str()); } }
GURLS_EXPORT void cholesky(const gMat2D<float>& A, gMat2D<float>& L, bool upper) { float* chol = cholesky<float>(A.getData(), A.rows(), A.cols(), upper); copy(L.getData(), chol, A.getSize()); delete [] chol; }
void RecursiveRLSCholUpdateWrapper<T>::update(const gMat2D<T> &X, const gMat2D<T> &y) { if(!this->trainedModel()) throw gException("Error, Train Model First"); RLSPrimalRecUpdateCholesky<T> optimizer; const unsigned long d = X.getSize(); const unsigned long t = y.getSize(); gMat2D<T>X_mat(1, d); copy(X_mat.getData(), X.getData(), d); gMat2D<T>y_mat(1, t); copy(y_mat.getData(), y.getData(), t); GurlsOptionsList* ret = optimizer.execute(X_mat, y_mat, *(this->opt)); this->opt->removeOpt("optimizer"); this->opt->addOpt("optimizer", ret); }