R语言中计算/转换二进制矩阵数值向量及自动构建置换转二进制矩阵
我来帮你搞定这两个R语言相关的问题,直接上易懂的解释和实用代码:
问题1:二进制矩阵与数值向量的转换/计算
实际场景中,这类需求通常分为两种:把数值向量转成二进制矩阵,或者把二进制矩阵转成数值向量,下面分别演示:
数值向量 → 二进制矩阵
如果要把十进制数转成二进制矩阵(每行对应一个数的二进制位),可以用intToBits()函数,不过它返回的是raw类型,需要转成整数再整理矩阵:
# 示例数值向量 num_vec <- c(3, 5, 7) # 转换为4位二进制矩阵(低位在前,若要高位在前,把[1:4]改成[4:1]) binary_mat <- t(sapply(num_vec, function(x) as.integer(intToBits(x))[1:4])) colnames(binary_mat) <- paste0("bit_", 1:4) # 命名二进制位 print(binary_mat)
输出结果:
bit_1 bit_2 bit_3 bit_4 [1,] 1 1 0 0 [2,] 1 0 1 0 [3,] 1 1 1 0
二进制矩阵 → 数值向量
反过来,把二进制矩阵每行转成十进制数,用矩阵乘法结合2的幂次就能实现:
# 示例二进制矩阵(高位在前) binary_mat <- matrix(c(0,0,1,1, 0,1,0,1, 0,1,1,1), nrow=3, byrow=TRUE) colnames(binary_mat) <- paste0("bit_", 4:1) # 对应2^3到2^0 # 转换为数值向量 num_vec <- binary_mat %*% 2^(ncol(binary_mat)-1:0) print(num_vec)
输出结果:
[,1] [1,] 3 [2,] 5 [3,] 7
问题2:将向量
c(1,2,3)的相关子集转换为类二进制格式(得到7个值) 首先澄清一下:3个元素的置换只有6种,而你要的7个值应该是指所有非空子集的类二进制表示(2^3-1=7个)。下面就基于这个需求实现:
生成7个二进制向量(对应所有非空子集)
我们可以先生成所有非空子集的索引,再把每个子集转换成二进制向量,最终组成矩阵:
vec <- c(1,2,3) # 生成所有非空子集的索引(从单元素到全元素) subsets <- lapply(1:length(vec), function(k) combn(1:length(vec), k, simplify=FALSE)) subsets <- unlist(subsets, recursive=FALSE) # 转换为类二进制矩阵(每行代表一个子集的二进制标记:1表示元素在子集中,0表示不在) binary_matrix <- t(sapply(subsets, function(idx) { binary <- rep(0, length(vec)) binary[idx] <- 1 binary })) # 给每行命名,对应具体子集 rownames(binary_matrix) <- sapply(subsets, function(idx) paste(vec[idx], collapse=",")) print(binary_matrix)
输出结果:
[,1] [,2] [,3] 1 1 0 0 2 0 1 0 3 0 0 1 1,2 1 1 0 1,3 1 0 1 2,3 0 1 1 1,2,3 1 1 1
转换为7个十进制数值(可选)
如果不需要矩阵,只要7个数值,直接把二进制向量转成十进制数就行:
binary_values <- binary_matrix %*% 2^(length(vec)-1:0) print(binary_values)
输出结果:
[,1] 1 4 2 2 3 1 1,2 6 1,3 5 2,3 3 1,2,3 7
这样就得到了你想要的7个值啦。
内容的提问来源于stack exchange,提问作者Ezra
相关产品推荐
相关产品推荐

