Serpentine design and sorting
Take a grid and serpentine it row-wise or column-wise
This fn joins two matrices alternately columnwise, which is why this is the source of inspiration for generating serpentine design.
alternate.cols <- function(m1, m2) {
cbind(m1, m2)[, order(c(seq(ncol(m1)), seq(ncol(m2))))]
}
A custom function to create a serpentine design in whatever fashion specified:
serpentine <- function(x, columnwise=TRUE){
if (columnwise) {
odd <- x[, seq(1, by=2, length.out = ncol(x)/2)] # odd x
rev_even <- x[, seq(from = 2,
by=2,
length.out = (ifelse((ncol(x)%%2 != 0),
((ncol(x)/2)-1),
(ncol(x)/2))))][seq(dim(x)[1],1),] # or, even[rev(1:nrow(x)),] # reversed even x
alternate_cbind <- cbind(odd, rev_even)[, order(c(seq(ncol(odd)),
seq(ncol(rev_even))))]
return(alternate_cbind)}
else {
odd <- x[seq(1, by=2, length.out = nrow(x)/2),] # odd x
rev_even <- x[seq(from = 2, by=2, length.out = (ifelse((nrow(x)%%2 != 0),
((nrow(x)/2)-1),
(nrow(x)/2)))), ][, seq(dim(x)[2],1)] # or, even[, rev(1:ncol(x))] # reversed even x
alternate_rbind <- rbind(odd, rev_even)[order(c(seq(nrow(odd)),
seq(nrow(rev_even)))), ]
return(alternate_rbind)
}
}
Let’s see the function in action