2013-01-02 69 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(大概只有一次!),那麼你仍然可能更好地循環排列而不是創建相對較大的數據對象。