在R中,我对一般情况感兴趣,从公式生成矩阵,如:
X = some other matrix
Y(i, j) = X(i, j) + Y(i - 1, j - 1)
不幸的是我无法找到如何解释矩阵自引用。
显然执行顺序和边界检查是这里的因素,但我想这些可以通过矩阵方向和公式来解释。
感谢。
答案 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
}