void OverwriteCols(DenseMatrix<T>& A, const DenseMatrix<T>& B, const std::vector<unsigned int>& col_indices, const unsigned int num_cols) { const unsigned int height = A.Height(); // Overwrite columns of A with B. if (B.Height() != A.Height()) throw std::logic_error("OverwriteCols: height mismatch"); if (num_cols > static_cast<unsigned int>(A.Width())) throw std::logic_error("OverwriteCols: col indices out of bounds"); T* buf_a = A.Buffer(); const unsigned int ldim_a = A.LDim(); const T* buf_b = B.LockedBuffer(); const unsigned int ldim_b = B.LDim(); for (unsigned int c=0; c<num_cols; ++c) { unsigned int col_a = col_indices[c]; unsigned int offset_a = col_a*ldim_a; unsigned int offset_b = c*ldim_b; memcpy(&buf_a[offset_a], &buf_b[offset_b], height * sizeof(T)); } }
void Overwrite(DenseMatrix<T>& A, const DenseMatrix<T>& B, const std::vector<unsigned int>& row_indices, const std::vector<unsigned int>& col_indices, const unsigned int num_rows, const unsigned int num_cols) { // Overwrite entries in A with entries in B. The row and column // index arrays contain the destination indices to be overwritten. // Matrix B has size num_rows x num_cols. if (num_rows > static_cast<unsigned int>(A.Height())) throw std::logic_error("Overwrite: row indices out of bounds"); if (num_cols > static_cast<unsigned int>(A.Width())) throw std::logic_error("Overwrite: col indices out of bounds"); const T* buf_b = B.LockedBuffer(); const unsigned int ldim_b = B.LDim(); T* buf_a = A.Buffer(); const unsigned int ldim_a = A.LDim(); for (unsigned int c=0; c<num_cols; ++c) { unsigned int col_a = col_indices[c]; unsigned int offset_a = ldim_a * col_a; unsigned int offset_b = ldim_b * c; for (unsigned int r=0; r<num_rows; ++r) { unsigned int row_a = row_indices[r]; //T val = B.Get(r, c); //A.Set(row_a, col_a, val); buf_a[offset_a + row_a] = buf_b[offset_b + r]; } } }
void ZeroizeSmallValues(DenseMatrix<T>& A, const T tol) { // set Aij to zero if |Aij| < tol T* buf = A.Buffer(); const unsigned int ldim = A.LDim(); const unsigned int height = A.Height(); const unsigned int width = A.Width(); OPENMP_PRAGMA(omp parallel for) for (unsigned int c=0; c<width; ++c) { unsigned int col_offset = c*ldim; for (unsigned int r=0; r<height; ++r) { T val = buf[col_offset + r]; if (std::abs(val) < tol) { buf[col_offset + r] = T(0); } } } }