2014-05-04 136 views
0

矩陣R I很感興趣的一般情況下來從一個公式,如矩陣:R:生成功能

X = some other matrix 
Y(i, j) = X(i, j) + Y(i - 1, j - 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 
} 
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)很容易。

+0

我想沒有快捷方式。最終使用Rpp的C++路線! –