在R语言中将二进制整数向量转换为整数的实现方案求助
二进制向量/矩阵转整数(支持并行处理)
单个二进制向量转换
直接用向量运算实现,无需依赖已移除的第三方包:
# 示例向量 x <- c(0, 0, 0, 1) # 转换函数:按位计算权重并求和 binary_to_int <- function(vec) { sum(vec * 2^rev(seq_along(vec) - 1)) } binary_to_int(x) # 输出:1
矩阵批量转换(每行对应一个二进制串)
如果数据是以矩阵形式存储(每行是一组二进制向量),用矩阵乘法实现高效批量计算:
# 示例矩阵:2行4列,每行对应一个二进制向量 mat <- rbind( c(0, 0, 0, 1), c(1, 0, 1, 0) ) # 生成每一位对应的权重向量(2的幂次) weights <- 2^rev(seq(ncol(mat)) - 1) # 矩阵乘法批量计算每行的整数结果 mat_to_ints <- mat %*% weights mat_to_ints # 输出:1 和 10
并行处理方案(针对超大规模矩阵)
当矩阵行数极多(如百万级),可通过parallel包实现并行加速:
library(parallel) # 将矩阵按行拆分为若干块,拆分数量可根据核心数调整 split_mat <- split(seq(nrow(mat)), cut(seq(nrow(mat)), 4)) # 获取可用核心数(保留1个核心给系统) n_cores <- detectCores() - 1 # 并行计算每块的结果 parallel_results <- mclapply(split_mat, function(idx) { mat[idx, ] %*% weights }, mc.cores = n_cores) # 合并并行计算结果 final_results <- do.call(rbind, parallel_results)
若偏好tidyverse风格,也可使用furrr包实现并行:
library(furrr) # 设置并行会话 plan(multisession, workers = n_cores) # 将矩阵按行转为列表,并行映射转换函数 mat_list <- asplit(mat, 1) parallel_results <- future_map_dbl(mat_list, binary_to_int)
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

