2016-04-21 23 views
1

我正在使用數學模型,其中函數包含在矩陣內以模擬生物種羣的動態。這通常需要調用函數來更新矩陣,然後執行矩陣乘法以將系統的動態投影到下一個時間步驟。我想知道是否可以直接在矩陣中嵌入一個函數,並跳過顯式更新矩陣元素。In R是否可以在包含函數的矩陣上進行矩陣運算?

的模型看起來像這樣: 所述系統的狀態是在矩陣X1,例如

X <- c(0,10) 

系統更改根據矩陣A

A <- matrix(data = c(0, NA,0.75,0.75),nrow =2,byrow = T) 
    [,1] [,2] 
[1,] 0.00 NA 
[2,] 0.75 0.75 

當元件NA是一個函數元素2在X1中,像這樣

f.A.12 <- function(X.2){1 + (1 - X.2/1000)} 

所以系統是模擬的lik E本:基於X的狀態 更新marix一個

A[1,2] <- f.A.12(X[2]) 

迭代模型更新矩陣:

A%*%X 

    [,1] 
[1,] 19.9 
[2,] 7.5 

然後,這被重複1000次,每乘

真正的前更新模型使用包含多個函數的更大的矩陣。 是否有的R包,允許我直接在基質內嵌入功能,如

A.with.fx <- matrix(data = c(0, f.A.12, 
          0.75, 0.75), nrow =2,byrow = T) 

然後進行定期矩陣操作,例如

A.with.fx%*%X 

而無需顯式分配A中的值是每次迭代中X的函數? 我想這將需要一個功能,是一個修改%*%操作,它自己進行必要的查找。

+2

矩陣中的所有元素都必須是相同的類型。這意味着你可以有一個函數矩陣,但是你不能在一個numeric類型的矩陣中嵌入一個函數。 –

回答

2

我想你可能會試圖以最終不是很乾淨或標準的方式來解決問題。不要考慮包含標量函數的矩陣,而應考慮返回矩陣的函數。

你可以平凡做到:

update <- function(X) matrix(c(0,.75, f.A.12(X[2]), .75), 2) 

,並與一些虐待表示法:

`%**%` <- function(f, X) f(X) %*% X 
X <- update %**% X 

注意%*%是一個S4通用的,所以這是一個有點痛過載它。

或者,用少許代數可以拆分AX恆定和功能,以及處理複雜性的方法:

A = [ [ 0, 2 - x[2]/1000], 
     [.75, .75]   ] 
    = [[0, 2],[.75, .75]] + [[0, - x[2]/1000],[0, 0 ] ] 
    = c + g(x) 

這樣的更新可以改寫:

X = c * X + g(X) * X    

其中g是矩陣值函數,產生更慢但更乾淨:

g <- function(X) matrix(c(0,0, -x[2]/1000), 0), 2,2) 
C <- matrix(c(0,.75,2,.75),2) 
X <- c(0,10) 

> (X <- C %*% X + g(X) %*% X) 
    [,1] 
[1,] 19.9 
[2,] 7.5 

我們能做到通過組合g(X) %*% X好一點成一個功能:

f <- function(x) c(-x[2]^2/1000, 0 ) 

,並提供:

> X <- c(0,10) 
> (X <- C %*% X + f(X)) 
    [,1] 
[1,] 19.9 
[2,] 7.5 

這裏有一對夫婦的基準:

microbenchmark(two_step={A <- update(X); A %*% X}, 
        split=(C %*% X + g(X) %*% X), 
       composed= C %*% X + f(X) ) 
Unit: microseconds 
    expr min  lq mean median  uq max neval 
two_step 3.608 4.0900 4.85369 4.3730 4.9290 13.089 100 
    split 5.587 6.0400 7.72511 6.4900 7.3785 53.047 100 
composed 2.266 2.4835 2.78195 2.6815 2.9745 6.697 100