khai wrote on 12/19/2011 11:26:55 PM:

> Hi,
> 
> I'm very new to working with sparse matrices and would like to know how 
I
> can column permute a sparse matrix. Here is a small example: 
> 
> > M1 <-
> > spMatrix(nrow=5,ncol=6,i=sample(5,15,replace=TRUE),j=sample(6,
> 15,replace=TRUE),x=round_any(rnorm(15,2),0.001))
> > M1
> 5 x 6 sparse Matrix of class "dgTMatrix"
> 
> [1,] 2.983      .     1.656    5.003    .        .
> [2,]    .            .     2.990        .         .        .
> [3,]    .     0.592   5.349    1.115    .        .
> [4,] 1.836      .     2.804        .         .        .
> [5,]    .     6.961       .             .         .     1.077
> 
> I know I can permute entire columns this way
> 
> > M1[,sample(6,6)]
> 5 x 6 sparse Matrix of class "dgTMatrix"
> 
> [1,] 5.003        .           .           .       1.656    2.983
> [2,]     .             .           .           .       2.990       .
> [3,] 1.115    0.592      .           .       5.349       .
> [4,]     .             .           .          .       2.804     1.836
> [5,]     .         6.961   1.077     .          .            .
> 
> But I would like the new sparse matrix to look like this...where only 
the
> nonzero elements are permuted.
> 
> [1,] 1.656      .     5.003    2.983    .        .
> [2,]    .            .     2.990        .         .        .
> [3,]    .    5.349    1.115    0.592    .        .
> [4,] 2.804      .     1.836        .         .        .
> [5,]    .     1.077       .             .         .     6.961
> 
> Thanks in advance for any advice!


I don't have experience with sparse matrices, but I was able to get this 
to work by converting the sparse matrix to a "base" matrix and back again.


library(Matrix)

nonzero.cols <- !apply(M1==0, 2, all)
M2 <- as.matrix(M1)
reord <- sample(seq(dim(M1)[2])[nonzero.cols])
M2[, nonzero.cols] <- as.matrix(M1[, reord])
Matrix(M2, sparse=TRUE)


Jean
	[[alternative HTML version deleted]]

