New function below is a bit faster due to more efficent memory handling.
for-loop FTW!
directionless_circular_permutations2 <- function( n ) {
n1 <- n - 1L
v <- seq.int( n1 )
ix <- combinations( n1, 2L )
jx <- permutations( n-3L, n-3L )
jxrows <- nrow( jx )
jxoffsets <- seq.int( jxrows )
result <- matrix( n, nrow = factorial( n1 )/2L, ncol = n )
k <- seq( 2L, n - 2L )
for ( i in seq.int( nrow( ix ) ) ) {
result[ ( i - 1L ) * jxrows + jxoffsets, k ] <-
matrix( v[ -ix[ i, ] ][ jx ], nrow = jxrows )
}
result[ , 1L ] <- rep( ix[ , 1L ], each = jxrows )
result[ , n1 ] <- rep( ix[ , 2L ], each = jxrows )
result
}
On Fri, 30 Mar 2018, Ranjan Maitra wrote:
Jeff,
I wanted to let you know that your function is faster than generating
the directional circular permutations and weeding.
Here is the time for n = 10. I compared with just doing the
permutations, there is no point in proceeding further with the weeding
since it is slower at the start itself.
system.time(directionless_circular_permutations(10))
user system elapsed
1.576 0.000 1.579
system.time(permutations(9,9))
user system elapsed
3.030 0.000 3.037
Repeats keep the values similar. All computations on a 10-core processor
@3.1GHz with 20 threads (using only one thread) and running the Fedora
27 with 4.15.9 kernel.
I have to say that I was surprised to see the difference at n = 10 itself.
Thanks again!
Best wishes,
Ranjan
On Thu, 29 Mar 2018 23:26:12 -0700 Jeff Newmiller <jdnew...@dcn.davis.ca.us>
wrote:
I don't know if this is more efficient than enumerating with distinct
directions and weeding... it seems kind of heavyweight to me:
#######
library(gtools)
directionless_circular_permutations <- function( n ) {
v <- seq.int( n-1 )
ix <- combinations( n-1, 2 )
jx <- permutations( n-3, n-3 )
x <- lapply( seq.int( nrow( ix ) )
, function( i ) {
cbind( ix[ i, 1 ]
, permutations( n-3
, n-3
, v[ -ix[ i, ] ]
)
, ix[ i, 2 ]
)
}
)
cbind( do.call( rbind, x ), n )
}
#######
For more speed, perhaps use Rcpp with [1]?
[1] http://howardhinnant.github.io/combinations.html
On Thu, 29 Mar 2018, Ranjan Maitra wrote:
Thanks!
Yes, however, this seems a bit wasteful. Just wondering if there are
other, more efficient options possible.
Best wishes,
Ranjan
On Thu, 29 Mar 2018 22:20:19 -0400 Boris Steipe <boris.ste...@utoronto.ca>
wrote:
If one is equal to the reverse of another, keep only one of the pair.
B.
On Mar 29, 2018, at 9:48 PM, Ranjan Maitra <mai...@email.com> wrote:
Dear friends,
I would like to get all possible arrangements of n objects listed 1:n on a
circle.
Now this is easy to do in R. Keep the last spot fixed at n and fill in the rest
using permuations(n-1, n-1) from the gtools package.
However, what if clockwise or counterclockwise arrangements are the same? I
know that half of the above (n - 1)! arrangements are redundant.
Is there an easy way to list these (n-1)!/2 arrangements?
I thought of only listing the first half from a call to permuations(n - 1, n -
1), but while this holds for n = 4, it does not for n = 5. So, I am wondering
if there is another function or tweak which would easily do this.
Many thanks in advance for any help. and best wishes,
Ranjan
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
--
Important Notice: This mailbox is ignored: e-mails are set to be deleted on
receipt. Please respond to the mailing list if appropriate. For those needing
to send personal or professional e-mail, please use appropriate addresses.
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go Live...
DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go...
Live: OO#.. Dead: OO#.. Playing
Research Engineer (Solar/Batteries O.O#. #.O#. with
/Software/Embedded Controllers) .OO#. .OO#. rocks...1k
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
--
Important Notice: This mailbox is ignored: e-mails are set to be deleted on
receipt. Please respond to the mailing list if appropriate. For those needing
to send personal or professional e-mail, please use appropriate addresses.
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go Live...
DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go...
Live: OO#.. Dead: OO#.. Playing
Research Engineer (Solar/Batteries O.O#. #.O#. with
/Software/Embedded Controllers) .OO#. .OO#. rocks...1k
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.