0

如果这个问题看起来很抽象,请道歉。我已经付出了很大的努力来清晰地呈现它。

设为长度S(n,L)为 的条目的向量集,例如和。{0,1,2,...,n}LS(1,2) = {0,0|0,1|1,0|1,1}S(5,1) = {0|1|2|3|4|5}

我有一个函数F,它接收元素S(n,L)并输出 0 到 100 之间的实数。

我想知道,给定一个r介于 0 到 100 之间的实数,我如何确定以下“相当小”的集合nl

S'(n,L,r) = {v in S(n,L)| F(v) >= r}

到目前为止,我所能做的就是S(n,L)通过以下代码生成:

f = function(n,L){

h = rep(list(0:n),L)

do.call(expand.grid,h)}

我对 R 中的这种东西非常陌生,所以任何帮助都将不胜感激。干杯

编辑:l已更改L为避免歧义。

4

2 回答 2

2

我认为这会起作用:

# Test values
n<-6
l<-3
r<-0

S.n.l<-f(n,l) # Generate the series
F<-function(x) rnorm(1) # Your function is more complicated
S.n.l [apply(S.n.l,1,F) >= r,] # Check if any value exceeds r and return.

但是如果F是矢量化的,那么你就不需要apply了,你的功能会快得多。例如,如果F只是简单地将这些值相加,那么您可以F(S.n.l)一次计算所有值。

于 2013-01-02T19:50:14.743 回答
0

您要描述的第一件事称为集合的排列。在 R 中,用于foo<- 0:n创建源向量。 expand.grid很好——尽管包中可能有一些plyr执行得更快的工具。

另一方面,您的函数F对这些值的实际作用确实很重要。如果您只是碰巧需要一些随机排列,那么 sample每次调用它时都会给您一个随机选择的排列,而无需每次都创建整个集合。如果您需要执行F每个可能的排列(大概只有一次!),那么您最好还是循环遍历排列而不是创建一个相对较大的数据对象。

于 2013-01-02T19:54:34.737 回答