2012-12-03 103 views
-1

我已中的R構成的兩個可變整數值函數f(x,y)其僅以及 - 用於單個條目定義(未例如f(1,1:5))。我有效地尋找有價值的功能F(x,y,z,w)整數這將使輸出:如何將兩個可變函數的輸出存儲爲矩陣

f(x,y),f(x,y+1),...,f(x,w),f(x+1,y),f(x+1,y+1),...,f(x+1,w),...,f(z,y),f(z,y+1),...,f(z,w)

(z-x+1) by (w-y+1)矩陣。歡呼任何幫助!

+0

凡標誌着下來,請說出你的理由使我可以改善這個問題。謝謝。 – user1873334

+0

因此,現在有兩個人投了這個票。我之前的問題仍然存在:我該如何改進它? – user1873334

回答

1

outer似乎是你在找什麼在這裏。

# make a simple function 
f <- function(x, y){x+y} 
x <- 3 
z <- 5 
y <- 2 
w <- 7 
outer(x:z, y:w, f) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] 5 6 7 8 9 10 
#[2,] 6 7 8 9 10 11 
#[3,] 7 8 9 10 11 12 

如果這是真的,你的函數真的只能採取標量的輸入,那麼你可能需要使用Vectorize,使這種方法工作

# Function that can only takes scalars... 
f <- function(x, y){if(length(x) > 1 | length(y) > 1) stop('blah'); x + y} 
outer(x:z, y:w, f) 
#Error in FUN(X, Y, ...) : blah 
myvectorizedfun <- Vectorize(f) 
outer(x:z, y:w, myvectorizedfun) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] 5 6 7 8 9 10 
#[2,] 6 7 8 9 10 11 
#[3,] 7 8 9 10 11 12 
+0

謝謝你的答案Dason。是否有可能使您的解決方案適應更常見的問題:假設我有一個帶三個參數的函數,例如'f = f(x,y,z){x + y + z}'和前面的限制一樣。我將如何創建一個函數'F(x1,x2,y1,y2,z)',它爲固定的'z'輸出與之前相同的矩陣。例如'F(1,2,1,3,6)'的第一行將讀爲'8,9,10',第二行將爲'9,10,11'。感謝您提供的任何輸入。 – user1873334

+0

@ user1873334'outer'需要一個'...'參數,它將任何附加參數傳遞給感興趣的函數。所以在你的情況下,如果f是像你的例子那樣定義的話,你可以'outer(x:z,y:w,f,z = 6)' – Dason

-1

我發現for循環是處理矩陣構建這樣的最直接方法。這是你想要做什麼的基本輪廓:

F <- function(x,y,z,w) { 
    Matrix <- matrix(nrow=z-x, ncol=w-y) # Set dimensions of your matrix 
    for(i in 1:(z-x)){      # Summing over all x 
     for (j in 1:(w-y)){     # Summing over all y 
      Matrix[i,j] <- f(i+x,j+y)  # Evaluate and store in matrix 
      }} 
    Matrix <<- Matrix     # Assign Matrix outside the function F 
    } 
+0

爲什麼你會做一個全局分配,而不是僅僅返回矩陣?我不認爲你的循環指數實際上是你認爲他們是... – Dason

+0

修正了指數。至於任務,你可以做,但是你希望它不重要。 –

+0

確實有可能做到這一點,但是要保存到全局變量是一種可怕的做法。如果您返回,而不是存儲到一個全球性的結果沒有覆蓋的東西的可能性,如果我們用自己的方式,然後有人可以調用這個函數的代碼的人,你沒有得到的代碼看起來魔術(即,然後突然後正在引用矩陣,即使他們從未明確地創建它...那很糟糕)。您的指數_still_也不對。注意1:5-3給出c(-2,-1,0,1,2)。你可能想要1:(5-3) – Dason

相關問題