如果这个问题看起来很抽象,请道歉。我已经做了很多努力以清晰的方式呈现它。
让S(n,L)
为长度为{0,1,2,...,n}
L
条目的向量集,例如S(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之间,我如何为“相当小的”n
和l
确定以下内容:
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
以避免含糊不清。
答案 0 :(得分: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)
。
答案 1 :(得分:0)
你所描述的第一件事就是你的集合的排列。在R中,使用foo<- 0:n
创建源向量。 expand.grid
很好 - 因为plyr
包中可能会有一些工具执行得更快。
另一方面,您的函数F
实际上对这些值的作用确实很重要。如果您恰好需要一些随机排列,那么sample
每次调用时都会给您一个随机选择的排列,而不需要每次创建整个集合。如果你需要为每个可能的排列执行F
(大概只需要一次!),那么你最好还是通过排列循环而不是创建一个相对较大的数据对象。