变换单位矩阵

Ujj*_*ari 9 r 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
Run Code Online (Sandbox Code Playgroud)

我想将其转换为矩阵,其中系列在 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
Run Code Online (Sandbox Code Playgroud)

Tho*_*ing 5

尝试下面的代码(给出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
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用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
Run Code Online (Sandbox Code Playgroud)


G. *_*eck 5

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

pmax(row(d) - col(d) + 1, 0)
Run Code Online (Sandbox Code Playgroud)

给予:

     [,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
Run Code Online (Sandbox Code Playgroud)

2)这种替代方案稍长(尽管仍然是单行),但如果重新排列 d 的列和/或缺少某些列,也可以使用。例如,

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

对 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
Run Code Online (Sandbox Code Playgroud)