如何生成L长度二进制码置换矩阵

时间:2015-12-28 11:52:20

标签: r lapply

为标题道歉。这是我的问题。 我需要生成一个L长度的二进制代码排列。 对于L = 2,它像: 00 01 10 11

我的想法是将问题分成两部分:

    1. 编写一个将整数转换为二进制形式的函数f
    1. 循环1:2 ^ L

以下是我对第1步的功能:

kbitpermute <- function(input = 2^16 - 1, k = 16){
  ret = matrix(0, ncol = k, nrow = 1)
  for(i in 1:k){
    ret[1,k-i+1] = input & 1
    input = bitwShiftR(input, 1)
  }
  return(ret)
}

然后我使用lapply()获取排列,例如:

temp3 = lapply(1:2^2 - 1, kbitpermute, k = 2)
temp3
[[1]]
     [,1] [,2]
[1,]    0    0

[[2]]
     [,1] [,2]
[1,]    0    1

[[3]]
     [,1] [,2]
[1,]    1    1

[[4]]
     [,1] [,2]
[1,]    1    1

似乎有效,但如何将lapply的输出转换为矩阵形式?并且,有没有简单的方法来完成整个任务?

=== update ===

我找到了一种使用unlist进行转换的方法,例如

temp3 = t(matrix(unlist(lapply(1:2^2 - 1, kbitpermute, k = 2)), nrow = 2, ncol=2^2))

但有什么简单的方法吗?

=== update ===

正确的kbitpermute版本,特别感谢@Batanichek

kbitpermute <- function(input = 2^16 - 1, k = 16){
  ret = matrix(0, ncol = k, nrow = 1)
  for(i in 1:k){
    ret[1,k-i+1] = bitwAnd(input, 1)
    input = bitwShiftR(input, 1)
  }
  return(ret)
}
> t(sapply(1:2^2 - 1, kbitpermute, k = 2))
     [,1] [,2]
[1,]    0    0
[2,]    0    1
[3,]    1    0
[4,]    1    1

1 个答案:

答案 0 :(得分:2)

尝试类似(来自here

的内容
test=function(x,k){
  a=rev(as.integer(intToBits(x))[1:k])
  return(a)
}
x=2  
t(sapply(1:2^x - 1, test,k=x))
#     [,1] [,2]
#[1,]    0    0
#[2,]    0    1
#[3,]    1    0
#[4,]    1    1

时间比较

x=15
system.time(t(sapply(1:2^x - 1, test,k=x)))
#пользователь      система       прошло 
#    0.62         0.21         1.35
system.time(t(sapply(1:2^x - 1, kbitpermute,k=x)))
#пользователь      система       прошло 
#    1.84         0.35         2.48  

(P.S.have不是英语本地人)