如何在R语言中生成n维空间的所有移动方向组合?
解决n维空间±1方向组合生成问题
我懂你要的是什么——就是生成n维空间里每个维度取1或-1的所有可能组合,本质上是每个维度独立选择的笛卡尔积,gtools的permutations确实不对路,因为它是生成元素不重复的排列,而我们这里每个维度都可以重复选1或-1,所以得换个思路。
方法一:用位运算生成和示例顺序完全一致的组合
这个方法通过二进制数映射每个组合,生成的顺序和你给出的n=2示例完全匹配,而且对于n=8到12(256到4096种组合)处理效率很高:
func <- function(n) { # 生成从0到2^n - 1的所有整数,每个数对应一种组合 num_range <- 0:(2^n - 1) # 把每个整数转成n位二进制,再映射为1/-1 direction_matrix <- t(sapply(num_range, function(x) { # 提取n位二进制位,补前导零保证长度为n binary_bits <- rev(intToBits(x)[1:n]) # 二进制0对应1,1对应-1 ifelse(binary_bits == 0, 1, -1) })) # 给列命名(可选,方便识别维度) colnames(direction_matrix) <- paste0("dim_", 1:n) return(direction_matrix) }
测试n=2的情况:
func(2) # dim_1 dim_2 # [1,] 1 1 # [2,] 1 -1 # [3,] -1 1 # [4,] -1 -1
方法二:用expand.grid生成笛卡尔积(简单直观)
如果你不介意顺序,expand.grid是更直观的方式,直接生成所有维度的笛卡尔积:
func <- function(n) { # 生成n个包含1和-1的向量列表 dim_choices <- replicate(n, c(1, -1), simplify = FALSE) # 计算笛卡尔积 result_df <- expand.grid(dim_choices) # 转成矩阵格式(可选,方便后续变量增减操作) result_matrix <- as.matrix(result_df) return(result_matrix) }
这个方法生成的组合顺序和示例略有不同,但所有组合都完整覆盖,对于后续变量增减的场景完全够用。
为什么gtools::permutations不适用?
permutations(k, n, vec)是从vec里选k个元素生成不重复的排列,比如permutations(2,2,c(1,-1))只会得到2种排列,而我们需要的是每个维度独立选择,总共有2^n种组合,两者的逻辑完全不同,所以不适用。
内容的提问来源于stack exchange,提问作者broccoli
相关产品推荐
相关产品推荐

