解决涉及输入为向量的函数的不等式

时间:2013-01-02 19:33:47

标签: r

如果这个问题看起来很抽象,请道歉。我已经做了很多努力以清晰的方式呈现它。

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之间,我如何为“相当小的”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以避免含糊不清。

2 个答案:

答案 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(大概只需要一次!),那么你最好还是通过排列循环而不是创建一个相对较大的数据对象。