setDiagonalMatrix
C++ Function Reference
1 Signature
void BigDataStatMeth::setDiagonalMatrix(BigDataStatMeth::hdf5Dataset *dsMat, Rcpp::NumericVector intNewDiagonal)2 Description
Sets the diagonal elements of a matrix stored in HDF5 format.
3 Parameters
dsMat(BigDataStatMeth::hdf5Dataset *): Target HDF5 dataset containing the matrixintNewDiagonal(Rcpp::NumericVector): Vector of new diagonal values to set
4 Details
dsMatTarget HDF5 dataset containing the matrix intNewDiagonalVector of new diagonal values to set Implementation approach:Writes diagonal elements one at a timeUses HDF5 block writing for efficient accessPreserves existing non-diagonal elements
5 Call Graph
6 Source Code
NoteImplementation
File: inst/include/hdf5Algebra/matrixDiagonal.hpp • Lines 104-136
inline void setDiagonalMatrix(BigDataStatMeth::hdf5Dataset* dsMat, Rcpp::NumericVector intNewDiagonal)
{
try {
const hsize_t DIAG_BLOCK_SIZE = 256;
hsize_t matrix_size = intNewDiagonal.size();
std::vector<hsize_t> stride = {1, 1}, block = {1, 1};
for (hsize_t block_start = 0; block_start < matrix_size; block_start += DIAG_BLOCK_SIZE) {
hsize_t current_block_size = std::min(DIAG_BLOCK_SIZE, matrix_size - block_start);
// Read square block starting from diagonal position
std::vector<hsize_t> offset = {block_start, block_start};
std::vector<hsize_t> count = {current_block_size, current_block_size};
std::vector<double> block_data(current_block_size * current_block_size);
dsMat->readDatasetBlock(offset, count, stride, block, block_data.data());
// Map to Eigen for correct R/HDF5 layout handling
Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>
block_matrix(block_data.data(), current_block_size, current_block_size);
// Use Eigen diagonal assignment - NO LOOP NEEDED
Eigen::Map<Eigen::VectorXd> diagonal_segment(REAL(intNewDiagonal) + block_start, current_block_size);
block_matrix.diagonal() = diagonal_segment;
// Write modified block back
dsMat->writeDatasetBlock(Rcpp::wrap(block_matrix), offset, count, stride, block, false);
}
} catch(std::exception& ex) {
Rcpp::stop("c++ exception setDiagonalMatrix: "+ std::string(ex.what()));
}
}7 Usage Example
#include "BigDataStatMeth.hpp"
// Example usage
auto result = setDiagonalMatrix(...);