// Reconstruct block in the image sequence after thresholding arma::cube Reconstruct(double lambda) { arma::cube v = arma::zeros<arma::cube>(Nx, Ny, T); arma::cube weights = arma::zeros<arma::cube>(Nx, Ny, T); arma::mat block, Ublock, Vblock; arma::vec Sblock; block.set_size(Bs*Bs, T); Ublock.set_size(Bs*Bs, T); Sblock.set_size(T); Vblock.set_size(T, T); #pragma omp parallel for shared(v, weights) \ private(block, Ublock, Sblock, Vblock) for (int it = 0; it < newVecSize; it++) { Ublock = U[it]; Sblock = S[it]; Vblock = V[it]; // Basic singular value thresholding // arma::vec Snew = arma::sign(Sblock) // % arma::max( // arma::abs(Sblock) - lambda, // arma::zeros<arma::vec>(T)); // Gaussian-weighted singular value thresholding arma::vec wvec = arma::abs(Sblock.max() * arma::exp(-1 * lambda * arma::square(Sblock)/2)); // Apply threshold arma::vec Snew = arma::sign(Sblock) % arma::max( arma::abs(Sblock) - wvec, arma::zeros<arma::vec>(T)); // Reconstruct from SVD block = Ublock * diagmat(Snew) * Vblock.t(); // Deal with block weights (TODO: currently all weights = 1) for (int k = 0; k < T; k++) { int newy = patches(0, actualpatches(it), k); int newx = patches(1, actualpatches(it), k); v(arma::span(newy, newy+Bs-1), arma::span(newx, newx+Bs-1), arma::span(k, k)) += arma::reshape(block.col(k), Bs, Bs); weights(arma::span(newy, newy+Bs-1), arma::span(newx, newx+Bs-1), arma::span(k, k)) += arma::ones<arma::mat>(Bs, Bs); } } // Include the weighting v /= weights; v.elem(find_nonfinite(v)).zeros(); return v; }
// [[Rcpp::export]] arma::mat BeQTL2(const arma::mat & A, const arma::mat & B, const arma::umat & Bootmat){ int bsi= Bootmat.n_rows; arma::mat C(A.n_cols*B.n_cols,Bootmat.n_rows); arma::mat tC(A.n_rows,B.n_rows); for(int i=0; i<bsi; i++){ tC = cor(A.rows(Bootmat.row(i)),B.rows(Bootmat.row(i))); C.col(i) = vectorise(tC,0); } C.elem(find_nonfinite(C)).zeros(); return reshape(median(C,1),A.n_cols,B.n_cols); }
inline uvec find_nonfinite(const BaseCube<typename T1::elem_type,T1>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube<T1> tmp(X.get_ref()); const Mat<eT> R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find_nonfinite(R); }
//Script that takes two matrices, performs bootstrapped correlation, and returns the median // [[Rcpp::export]] arma::mat BeQTL(const arma::mat & A, const arma::mat & B, const arma::umat & Bootmat){ int bsi= Bootmat.n_rows; Rcpp::Rcout<<"Starting Bootstrap!"<<std::endl; arma::mat C(A.n_cols*B.n_cols,Bootmat.n_rows); arma::mat tA(A.n_rows,A.n_cols); arma::mat tB(B.n_rows,B.n_cols); arma::mat tC(A.n_rows,B.n_rows); for(int i=0; i<bsi; i++){ tA = A.rows(Bootmat.row(i)); tB = B.rows(Bootmat.row(i)); tC = cor(tA,tB); C.col(i) = vectorise(tC,0); } C.elem(find_nonfinite(C)).zeros(); return reshape(median(C,1),A.n_cols,B.n_cols); }
//Function to perform point estimate of correlation // [[Rcpp::export]] arma::mat PointCor(const arma::mat & A, const arma::mat & B){ arma::mat C= cor(A,B); C.elem(find_nonfinite(C)).zeros(); return C; }