【问题标题】:Vectorized permutations向量化排列
【发布时间】:2012-01-22 02:20:59
【问题描述】:

我有一个包含 12 个对象的数组。每一个都是一个字母。我想生成 4、5、6、7 和 8 个字母的所有组合。

首先我只是使用gregmisc 包生成排列:

sapply(4:8, function(x) permutations(n = 12, r = x)) -> perms

然后我想获取名为letters.split 的对象数组,并且我想创建所有组合。所以我走了:

unlist(lapply(perms, a <- function (x){
        apply(x, 1, function(y) letters.split[y])
    })) -> combos

这似乎在计算上效率很低..需要一段时间。必须有更好的方法在索引处使用排列组合。排列函数并不是真正让我感到困扰的,因为我只需要这样做,然后我就可以保存它。

我想问是否有这样做的矢量化方式,但我实际上并不知道这意味着什么,所以简单地解释一下矢量化函数的简单术语将不胜感激。

【问题讨论】:

  • 我不完全清楚你在问什么,虽然看起来你可能只是想重新创建 combn 函数?
  • 第二步看起来没有必要:permutations 函数有一个 v 参数,可以直接置换您的数据,而无需考虑索引:lapply( 4:6, permutations, n=8, v=LETTERS[1:12] )
  • 问“什么是向量化函数?”在一个新问题中。

标签: r vectorization permutation


【解决方案1】:

Vincent Zoonekynd 将得到答案。

第二步看起来没有必要:vegan 包的permutations 函数有一个v 参数,可以直接置换您的数据,而无需考虑索引:

x <- lapply(2:3, permutations, n = 3, v = LETTERS[1:12])

输出:

[[1]]
     [,1] [,2]
[1,] "A"  "B" 
[2,] "A"  "C" 
[3,] "B"  "A" 
[4,] "B"  "C" 
[5,] "C"  "A" 
[6,] "C"  "B" 

[[2]]
     [,1] [,2] [,3]
[1,] "A"  "B"  "C" 
[2,] "A"  "C"  "B" 
[3,] "B"  "A"  "C" 
[4,] "B"  "C"  "A" 
[5,] "C"  "A"  "B" 
[6,] "C"  "B"  "A" 

二。向量化函数是将向量作为参数的函数。通常(尤其是在 C 等其他语言中)您的函数将单个值作为参数,因此您必须使用 for-loop 循环遍历数组。

例如:

计算数字数组的log10 - 1、10、100、1000。

非向量化方法(类 C 风格):

x <- c(1, 10, 100, 1000)
for(i in 1:4) {
  print(log10(x[i]))
}

# [1] 0
# [1] 1
# [1] 2
# [1] 3

矢量化方法。由于log10 是向量化函数,因此您可以将它与向量一起用作参数。

x <- 10 
log10(x)
# [1] 0 1 2 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2021-10-11
    • 2021-08-05
    • 2021-09-25
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多