R:从函数生成矩阵

时间:2014-05-04 15:42:52

标签: r matrix formula self-reference

在R中,我对一般情况感兴趣,从公式生成矩阵,如:

X = some other matrix
Y(i, j) = X(i, j) + Y(i - 1, j - 1)

不幸的是我无法找到如何解释矩阵自引用。

显然执行顺序和边界检查是这里的因素,但我想这些可以通过矩阵方向和公式来解释。

感谢。

2 个答案:

答案 0 :(得分:0)

好吧,你总是可以使用for循环:

Y <- matrix(0, ncol=3, nrow=3)
#boundary values:
Y[1,] <- 1
Y[,1] <- 2

X <- matrix(1:9, ncol=3)

for (i in 2:nrow(Y)) {
  for (j in 2:ncol(Y)) {
    Y[i, j] <- X[i, j] + Y[i-1, j-1]
  }
}

如果速度太慢,您可以轻松地将其转换为C ++(使用Rcpp)。

答案 1 :(得分:0)

此解决方案假设您需要Y[1,n] == X[1,n]Y[n,1] == X[n,1]。如果不是,您可以在子矩阵X [-1,-1]上应用相同的解决方案来填充Y [-1,-1]的值。它还假设输入矩阵是方形的。

我们使用Y[N,N] = X[N,N] + X[N-1, N-1] + ... + X[1,1]加上非对角元素的相似关系这一事实。注意,非对角线元素是特定子矩阵的对角线。

# Example input
X <- matrix(1:16, ncol=4)

Y <- matrix(0, ncol=ncol(X), nrow=nrow(X))

diag(Y) <- cumsum(diag(X))

Y[1,ncol(X)] <- X[1,ncol(X)]
Y[nrow(X),1] <- X[nrow(X),1]

for (i in 1:(nrow(X)-2)) {
  ind <- seq(i)
  diag(Y[-ind,]) <- cumsum(diag(X[-ind,])) # lower triangle
  diag(Y[,-ind]) <- cumsum(diag(X[,-ind])) # upper triangle
}