Skip to content

Efficent way to create an nxn upper triangular matrix of one's

5 messages · Dale Steele, Sundar Dorai-Raj, Jorge Ivan Velez +2 more

#
The code below create an nxn upper triangular matrix of one's.  I'm
stuck on finding a more efficient vectorized way - Thanks.  --Dale

n <- 9
data <- matrix(data=NA, nrow=n, ncol=n)
data
for (i in 1:n) {
    data[,i] <- c(rep(1,i), rep(0,n-i))
}
data
#
Try

x <- diag(n)
x[upper.tri(x)] <- 1
On Wed, Feb 11, 2009 at 1:22 PM, Dale Steele <dale.w.steele at gmail.com> wrote:
#
Here is a way to do this:

round(upper.tri(matrix(1, 9, 9)))

Or if you also need the diagonal of one's

round(upper.tri(matrix(1, 9, 9), diag = TRUE))

-Christos
1 day later
#
The other solutions offered are perfectly workable. Here is a strategy  
that is generalizable to other matrix designs (and on checking the  
source of upper.tri and lower.tri, it's not surprising that they use  
precisely the same strategy):

n <- 9
dm <- matrix(0, nrow=n, ncol=n)

dm[col(dm) >= row(dm)] <- 1

If you wanted only upper off-diagonal -1's, for instance, you could  
use instead:

dm[col(dm) == (row(dm)+1) ] <- -1