// m=m-m*v*v' void sub_m_v_vT(mat &m, const vec &v) { vec v2(m.rows()); double tmp, *v2p; const double *vp; int i, j; it_assert(v.size() == m.cols(), "sub_m_v_vT()"); v2p = v2._data(); for (i = 0; i < m.rows(); i++) { tmp = 0.0; vp = v._data(); for (j = 0; j < m.cols(); j++) tmp += *(vp++) * m._elem(i, j); *(v2p++) = tmp; } v2p = v2._data(); for (i = 0; i < m.rows(); i++) { vp = v._data(); for (j = 0; j < m.cols(); j++) m._elem(i, j) -= *v2p * *(vp++); v2p++; } }
vec operator*(const mat &m, const vec &v) { it_assert_debug(m.no_cols == v.size(), "mat::operator*(): Wrong sizes"); vec r(m.no_rows); double alpha = 1.0; double beta = 0.0; char trans = 'n'; int incr = 1; blas::dgemv_(&trans, &m.no_rows, &m.no_cols, &alpha, m.data, &m.no_rows, v._data(), &incr, &beta, r._data(), &incr); return r; }
bool svd(const mat &A, vec &S) { char jobu='N', jobvt='N'; int m, n, lda, ldu, ldvt, lwork, info; m = lda = ldu = A.rows(); n = ldvt = A.cols(); lwork = max(3*min(m,n)+max(m,n), 5*min(m,n)); mat U, V; //U.set_size(m,m, false); //V.set_size(n,n, false); S.set_size(min(m,n), false); vec work(lwork); mat B(A); dgesvd_(&jobu, &jobvt, &m, &n, B._data(), &lda, S._data(), U._data(), &ldu, V._data(), &ldvt, work._data(), &lwork, &info); return (info==0); }
bool svd(const mat &A, mat &U, vec &S, mat &V) { char jobu='A', jobvt='A'; int m, n, lda, ldu, ldvt, lwork, info; m = lda = ldu = A.rows(); n = ldvt = A.cols(); lwork = max(3*min(m,n)+max(m,n), 5*min(m,n)); U.set_size(m,m, false); V.set_size(n,n, false); S.set_size(min(m,n), false); vec work(lwork); mat B(A); dgesvd_(&jobu, &jobvt, &m, &n, B._data(), &lda, S._data(), U._data(), &ldu, V._data(), &ldvt, work._data(), &lwork, &info); V = transpose(V); // This is probably slow!!! return (info==0); }
bool svd(const cmat &A, cmat &U, vec &S, cmat &V) { char jobu='A', jobvt='A'; int m, n, lda, ldu, ldvt, lwork, info; m = lda = ldu = A.rows(); n = ldvt = A.cols(); lwork = 2*min(m,n)+max(m,n); U.set_size(m,m, false); V.set_size(n,n, false); S.set_size(min(m,n), false); cvec work(lwork); vec rwork(max(1, 5*min(m, n))); cmat B(A); zgesvd_(&jobu, &jobvt, &m, &n, B._data(), &lda, S._data(), U._data(), &ldu, V._data(), &ldvt, work._data(), &lwork, rwork._data(), &info); V = transpose(conj(V)); // This is slow!!! return (info==0); }