Use this if you are using igraph from R
scg_semi_proj {igraph}  R Documentation 
A function to compute the L
and R
semiprojectors for a given
partition of the vertices.
scg_semi_proj(
groups,
mtype = c("symmetric", "laplacian", "stochastic"),
p = NULL,
norm = c("row", "col"),
sparse = igraph_opt("sparsematrices")
)
groups 
A vector of 
mtype 
The type of semiprojectors. For now “symmetric”, “laplacian” and “stochastic” are available. 
p 
A probability vector of length 
norm 
Either “row” or “col”. If set to “row” the rows of the Laplacian matrix sum up to zero and the rows of the stochastic sum up to one; otherwise it is the columns. 
sparse 
Logical scalar, whether to return sparse matrices. 
The three types of semiprojectors are defined as follows. Let
\gamma(j)
label the group of vertex j
in a partition
of all the vertices.
The symmetric semiprojectors are defined as
L_{\alpha j}=R_{\alpha
j}=
\frac{1}{\sqrt{\alpha}}\delta_{\alpha\gamma(j)},
the (row) Laplacian semiprojectors as
L_{\alpha
j}=\frac{1}{\alpha}\delta_{\alpha\gamma(j)}\,\,\,\,
\textrm{and}\,\,\,\, R_{\alpha
j}=\delta_{\alpha\gamma(j)},
and the (row) stochastic semiprojectors as
L_{\alpha
j}=\frac{p_{1}(j)}{\sum_{k\in\gamma(j)}p_{1}(k)}\,\,\,\,
\textrm{and}\,\,\,\, R_{\alpha
j}=\delta_{\alpha\gamma(j)\delta_{\alpha\gamma(j)}},
where p_1
is the (left) eigenvector
associated with the oneeigenvalue of the stochastic matrix. L
and
R
are defined in a symmetric way when norm = col
. All these
semiprojectors verify various properties described in the reference.
L 
The semiprojector 
R 
The semiprojector

David Morton de Lachapelle, http://people.epfl.ch/david.morton.
D. Morton de Lachapelle, D. Gfeller, and P. De Los Rios, Shrinking Matrices while Preserving their Eigenpairs with Application to the Spectral Coarse Graining of Graphs. Submitted to SIAM Journal on Matrix Analysis and Applications, 2008. http://people.epfl.ch/david.morton
scgmethod for a detailed introduction. scg
,
scg_eps
, scg_group
library(Matrix)
# compute the semiprojectors and projector for the partition
# provided by a community detection method
g < sample_pa(20, m = 1.5, directed = FALSE)
eb < cluster_edge_betweenness(g)
memb < membership(eb)
lr < scg_semi_proj(memb)
#In the symmetric case L = R
tcrossprod(lr$R) # same as lr$R %*% t(lr$R)
P < crossprod(lr$R) # same as t(lr$R) %*% lr$R
#P is an orthogonal projector
isSymmetric(P)
sum( (P %*% PP)^2 )
## use L and R to coarsegrain the graph Laplacian
lr < scg_semi_proj(memb, mtype="laplacian")
L < laplacian_matrix(g)
Lt < lr$L %*% L %*% t(lr$R)
## or better lr$L %*% tcrossprod(L,lr$R)
rowSums(Lt)