Example #1
0
// 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++;
  }
}
Example #2
0
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;
}
Example #3
0
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);
}
Example #4
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);
}
Example #5
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);
}