getDiagonalfromMatrix

C++ Function Reference

1 Signature

Rcpp::NumericVector BigDataStatMeth::getDiagonalfromMatrix(BigDataStatMeth::hdf5Dataset *dsMat)

2 Description

Extracts the diagonal elements from a matrix stored in HDF5 format.

3 Parameters

  • dsMat (BigDataStatMeth::hdf5Dataset *): Input HDF5 dataset containing the matrix

4 Returns

Rcpp::NumericVector Vector containing the diagonal elements

5 Details

dsMatInput HDF5 dataset containing the matrix Rcpp::NumericVector Vector containing the diagonal elements Implementation details:Reads diagonal elements one at a time to minimize memory usageUses HDF5 block reading for efficient accessReturns empty vector on error

6 Call Graph

Function dependencies

7 Source Code

File: inst/include/hdf5Algebra/matrixDiagonal.hppLines 46-80

inline Rcpp::NumericVector getDiagonalfromMatrix(BigDataStatMeth::hdf5Dataset* dsMat)
    {
        hsize_t matrix_size = dsMat->nrows();
        Rcpp::NumericVector diagonal(matrix_size);
        
        try {
            const hsize_t DIAG_BLOCK_SIZE = 256;
            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 extraction - NO LOOP NEEDED
                Eigen::Map<Eigen::VectorXd> diagonal_segment(REAL(diagonal) + block_start, current_block_size);
                diagonal_segment = block_matrix.diagonal();
            }
            
        } catch(std::exception& ex) {
            Rcpp::stop ("c++ exception getDiagonalfromMatrix: %s", ex.what());
            // Rcpp::Rcout << "c++ exception getDiagonalfromMatrix: " << ex.what();
        }
        
        return diagonal;
    }

8 Usage Example

#include "BigDataStatMeth.hpp"

// Example usage
auto result = getDiagonalfromMatrix(...);