void DenseGenMatrix::Copy(const DenseGenMatrix& M) { DBG_ASSERT(NCols()==M.NCols()); DBG_ASSERT(NRows()==M.NRows()); IpBlasDcopy(NCols()*NRows(), M.Values(), 1, values_, 1); initialized_ = true; ObjectChanged(); }
void DenseGenMatrix::CholeskySolveMatrix(DenseGenMatrix& B) const { DBG_ASSERT(NRows()==NCols()); DBG_ASSERT(B.NRows()==NRows()); DBG_ASSERT(initialized_); Number* Bvalues = B.Values(); IpLapackDpotrs(NRows(), B.NCols(), values_, NRows(), Bvalues, B.NRows()); }
void DenseSymMatrix::HighRankUpdate(bool trans, Number alpha, const DenseGenMatrix& V, Number beta) { DBG_ASSERT((!trans && Dim()==V.NRows()) || (trans && Dim()==V.NCols())); DBG_ASSERT(beta==0. || initialized_); Index nrank; if (trans) { nrank = V.NRows(); } else { nrank = V.NCols(); } IpBlasDsyrk(trans, Dim(), nrank, alpha, V.Values(), V.NRows(), beta, values_, NRows()); initialized_ = true; ObjectChanged(); }
void DenseGenMatrix::CholeskyBackSolveMatrix(bool trans, Number alpha, DenseGenMatrix& B) const { DBG_ASSERT(NRows()==NCols()); DBG_ASSERT(B.NRows()==NRows()); DBG_ASSERT(initialized_); Number* Bvalues = B.Values(); IpBlasDtrsm(trans, NRows(), B.NCols(), alpha, values_, NRows(), Bvalues, B.NRows()); }
void DenseGenMatrix::LUSolveMatrix(DenseGenMatrix& B) const { DBG_ASSERT(NRows()==NCols()); DBG_ASSERT(B.NRows()==NRows()); DBG_ASSERT(initialized_); DBG_ASSERT(factorization_==LU); Number* Bvalues = B.Values(); IpLapackDgetrs(NRows(), B.NCols(), values_, NRows(), pivot_, Bvalues, B.NRows()); }
void DenseGenMatrix::AddMatrixProduct(Number alpha, const DenseGenMatrix& A, bool transA, const DenseGenMatrix& B, bool transB, Number beta) { Index m = NRows(); DBG_ASSERT((transA && A.NCols()==m) || (!transA && A.NRows()==m)); Index n = NCols(); DBG_ASSERT((transB && B.NRows()==n) || (!transB && B.NCols()==n)); Index k; if (transA) { k = A.NRows(); } else { k = A.NCols(); } DBG_ASSERT((transB && B.NCols()==k) || (!transB && B.NRows()==k)); DBG_ASSERT(beta==0. || initialized_); IpBlasDgemm(transA, transB, m, n, k, alpha, A.Values(), A.NRows(), B.Values(), B.NRows(), beta, values_, NRows()); initialized_ = true; ObjectChanged(); }
void DenseSymMatrix::SpecialAddForLMSR1(const DenseVector& D, const DenseGenMatrix& L) { const Index dim = Dim(); DBG_ASSERT(initialized_); DBG_ASSERT(dim==D.Dim()); DBG_ASSERT(dim==L.NRows()); DBG_ASSERT(dim==L.NCols()); // First add the diagonal matrix const Number* Dvalues = D.Values(); for (Index i=0; i<dim; i++) { values_[i+i*dim] += Dvalues[i]; } // Now add the strictly-lower triagular matrix L and its transpose const Number* Lvalues = L.Values(); for (Index j=0; j<dim; j++) { for (Index i=j+1; i<dim; i++) { values_[i+j*dim] += Lvalues[i+j*dim]; } } ObjectChanged(); }