Search code examples
type-conversionigraphrcpparmadillo

Converting and an arma::mat adjacency matrix into an igraph graph in C (Rcpp)


I use Armadillo objects in some (Rcpp) code where I work with matrices.

The matrices are adjacency matrices and I need to quickly compute the components of the underlying network and though I could do this via igraph.

But I fail already at converting the adjacency matrix into something that can be used with igraph.

#include <RcppArmadillo.h>
#include <iostream>
#include <igraph-0.7.1\include\igraph.h>

using namespace arma;

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
vec component_membership(const mat& adjacencymatrix) {
  igraph_t  g;
  igraph_adjacency(&g,&adjacencymatrix,IGRAPH_ADJ_DIRECTED);
  // here is more code that is immaterial to my problem
}

On compilation it complains

 cannot convert 'const mat* {aka const arma::Mat<double>*}' to  
  'igraph_matrix_t*' for argument '2' to 
  'int igraph_adjacency(igraph_t*, igraph_matrix_t*, igraph_adjacency_t)'

I understand why that is the case: I believe igraph_matrix_t and arma::matrix must be fundamentally different data types. How can I convert, i.e., but how do i fix this easily?


Solution

  • As you suspected, igraph_matrix_t and arma::matrix are completely different types. The igraph documentation lists no methods that would make use of a C array for constructing an igraph_matrix_t, so I think one has to do it by hand. Something like this might work (totally untested!):

    igraph_matrix_t *m;
    int rc = igraph_matrix_init(m, mat.n_rows, mat.n_cols);
    for (unsigned long j = 0; j < mat.n_cols; ++j)
        for (unsigned long i = 0; i < mat.n_rows; ++i)
            igraph_matrix_set(m, i, j, mat(i, j));