为标题道歉。这是我的问题。 我需要生成一个L长度的二进制代码排列。 对于L = 2,它像: 00 01 10 11
我的想法是将问题分成两部分:
以下是我对第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
答案 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不是英语本地人)