在 R 中是否可以对包含函数的矩阵进行矩阵运算?
In R Is it possible to do matrix operations on matrices that contain functions?
我正在使用一个数学模型,其中函数包含在矩阵中以模拟生物种群的动态。这通常需要调用函数来更新矩阵,然后执行矩阵乘法以将系统的动态投射到下一个时间步长。我想知道是否可以将函数直接嵌入到矩阵中并跳过显式更新矩阵元素。
模型如下所示:
系统的状态在矩阵X1中,eg
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是X1中元素2的函数,像这样
f.A.12 <- function(X.2){1 + (1 - X.2/1000)}
于是系统模拟成这样:
根据 X
的状态更新 marix A
A[1,2] <- f.A.12(X[2])
使用更新后的矩阵迭代模型:
A%*%X
[,1]
[1,] 19.9
[2,] 7.5
然后迭代 1000 次,在每次乘法之前更新 A
真实模型使用包含多个函数的更大的矩阵。
有没有一个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 函数的值?
我想这需要一个函数,该函数是经过修改的 %*%
操作,可以自行进行必要的查找。
我认为您可能试图以一种最终不太干净或不标准的方式分解您的问题。与其考虑包含标量函数的矩阵,不如考虑 returns 矩阵的函数。
你可以简单地做:
update <- function(X) matrix(c(0,.75, f.A.12(X[2]), .75), 2)
还有一些滥用的符号:
`%**%` <- function(f, X) f(X) %*% X
X <- update %**% X
请注意 %*%
是 S4 泛型,因此重载它有点麻烦。
或者,通过一点代数,您可以将 A
拆分为常数和 X
的函数,并以这种方式处理复杂性:
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
我正在使用一个数学模型,其中函数包含在矩阵中以模拟生物种群的动态。这通常需要调用函数来更新矩阵,然后执行矩阵乘法以将系统的动态投射到下一个时间步长。我想知道是否可以将函数直接嵌入到矩阵中并跳过显式更新矩阵元素。
模型如下所示: 系统的状态在矩阵X1中,eg
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是X1中元素2的函数,像这样
f.A.12 <- function(X.2){1 + (1 - X.2/1000)}
于是系统模拟成这样: 根据 X
的状态更新 marix AA[1,2] <- f.A.12(X[2])
使用更新后的矩阵迭代模型:
A%*%X
[,1]
[1,] 19.9
[2,] 7.5
然后迭代 1000 次,在每次乘法之前更新 A
真实模型使用包含多个函数的更大的矩阵。 有没有一个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 函数的值?
我想这需要一个函数,该函数是经过修改的 %*%
操作,可以自行进行必要的查找。
我认为您可能试图以一种最终不太干净或不标准的方式分解您的问题。与其考虑包含标量函数的矩阵,不如考虑 returns 矩阵的函数。
你可以简单地做:
update <- function(X) matrix(c(0,.75, f.A.12(X[2]), .75), 2)
还有一些滥用的符号:
`%**%` <- function(f, X) f(X) %*% X
X <- update %**% X
请注意 %*%
是 S4 泛型,因此重载它有点麻烦。
或者,通过一点代数,您可以将 A
拆分为常数和 X
的函数,并以这种方式处理复杂性:
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