变换单位矩阵

Transform Identity Matrix

我有可以通过 diag(5)

生成的单位矩阵
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    0    1    0    0    0
[3,]    0    0    1    0    0
[4,]    0    0    0    1    0
[5,]    0    0    0    0    1

我想将其转换为矩阵,其中系列在 1 之后开始。例如,第一列,值 1 到 5。第二列 - 值 1 到 4。

期望输出

    [,1] [,2] [,3] [,4] [,5]
[1,]    1   0   0   0   0
[2,]    2   1   0   0   0
[3,]    3   2   1   0   0
[4,]    4   3   2   1   0
[5,]    5   4   3   2   1

尝试下面的代码(给定 m <- diag(5)

> (row(m) - col(m) + 1)*lower.tri(m,diag = TRUE)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    2    1    0    0    0
[3,]    3    2    1    0    0
[4,]    4    3    2    1    0
[5,]    5    4    3    2    1

另一种选择是使用 apply + cumsum

> apply(lower.tri(m, diag = TRUE), 2, cumsum)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    2    1    0    0    0
[3,]    3    2    1    0    0
[4,]    4    3    2    1    0
[5,]    5    4    3    2    1

一个选项可以是:

x <- 1:5
embed(c(rep(0, length(x) - 1), x), length(x))

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    2    1    0    0    0
[3,]    3    2    1    0    0
[4,]    4    3    2    1    0
[5,]    5    4    3    2    1

1) 如果 d <- diag(5) 是单位矩阵则:

pmax(row(d) - col(d) + 1, 0)

给予:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    2    1    0    0    0
[3,]    3    2    1    0    0
[4,]    4    3    2    1    0
[5,]    5    4    3    2    1

2) 这个替代方案稍微长一些(虽然仍然是一行),但如果 d 的列被重新排列也可以工作 and/or 一些列丢失了。例如,

dd <- d[, 4:1] # test data
pmax(outer(1:nrow(dd) + 1, max.col(t(dd)), `-`), 0)

d 和 dd 的结果相同:

     [,1] [,2] [,3] [,4]
[1,]    0    0    0    1
[2,]    0    0    1    2
[3,]    0    1    2    3
[4,]    1    2    3    4
[5,]    2    3    4    5

基于嵌套的解决方案cumsum:

n <- 5
m <- diag(n)

apply(m, 2, function(x) cumsum(cumsum(x)))

#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    1    0    0    0    0
#> [2,]    2    1    0    0    0
#> [3,]    3    2    1    0    0
#> [4,]    4    3    2    1    0
#> [5,]    5    4    3    2    1