2013-01-02 32 views
0

如果此问题看似抽象,则表示歉意。我已经做出了很大的努力,以清晰的方式呈现它。解决涉及输入为矢量的函数的不等式

S(n,L)为具有长度为L{0,1,2,...,n}中的条目的向量的集合,例如, 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

我想知道之间的实数,给出0和100之间的实数r,我怎么能确定下面的一组对于“相当小” 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以避免含糊不清。

+1

看来你想要的是F(S(n,l))大于'r'的S(n,l)的子集。不幸的是,您选择了小写字母_L作为您的变量名称,因为它看起来与数字1非常相似。你真的应该改变问题的名称。你不是“解决不平等”。 –

+0

@阿伦:'F'是我写的一个函数。 'S中的{v(n,L)| F(v)> = r}'是数学符号,并且在'S(n,L)'中给''给我向量,使得('|')当输入到'F'时产生大于或等于' r'。我决定用'S'(n,L,r)'表示这个集合。 – user1873334

+0

@DWin:我同意我用过的记号并不理想。我现在编辑它。但我相信我正在解决一个不等式:我有不等式'F(x)> = r',我想知道集合S(n,L)中的哪些向量满足它。 – user1873334

回答

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被矢量,那么你将不需要0​​,和你的函数会快很多。例如,如果F只是将这些值相加,那么您可以一次计算出所有F(S.n.l)

0

您所描述的第一件事就是您所设置的排列组合。在R中,使用foo<- 0:n创建源矢量。 expand.grid没问题 - 在'plyr包中可能会有一些工具会执行得更快。

另一方面,你的函数F实际上对这些值做了什么确实很重要。如果你碰巧需要一些随机排列,那么sample会在每次调用时给你一个随机选择的排列,而不需要每次创建整个排列。如果你需要为每个可能的排列执行F(大概只有一次!),那么你仍然可能更好地循环排列而不是创建相对较大的数据对象。