【问题标题】:create matrix where all diagonals are the same value in anti-diagonal direction创建矩阵,其中所有对角线在反对角方向上的值相同
【发布时间】:2020-02-28 02:25:27
【问题描述】:

我确定这种类型的矩阵有一个名称,但不确定。在R我想快速转换一个变量x

x = 1:10
x  #[1]  1  2  3  4  5  6  7  8  9 10

变成一个矩阵,其中所有对角线(不是主对角线)在一个方向上都相同,即反对角方向:

    x
1   1       2       3       4       5       6       7       8       9      10
2   2       3       4       5       6       7       8       9      10      NA
3   3       4       5       6       7       8       9      10      NA      NA
4   4       5       6       7       8       9      10      NA      NA      NA
5   5       6       7       8       9      10      NA      NA      NA      NA
6   6       7       8       9      10      NA      NA      NA      NA      NA
7   7       8       9      10      NA      NA      NA      NA      NA      NA
8   8       9      10      NA      NA      NA      NA      NA      NA      NA
9   9      10      NA      NA      NA      NA      NA      NA      NA      NA
10 10      NA      NA      NA      NA      NA      NA      NA      NA      NA

谢谢

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    我们可以从data.table使用shift

    library(data.table)
    do.call(cbind, shift(x, 0:9, type = 'lead'))
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    # [1,]    1    2    3    4    5    6    7    8    9    10
    # [2,]    2    3    4    5    6    7    8    9   10    NA
    # [3,]    3    4    5    6    7    8    9   10   NA    NA
    # [4,]    4    5    6    7    8    9   10   NA   NA    NA
    # [5,]    5    6    7    8    9   10   NA   NA   NA    NA
    # [6,]    6    7    8    9   10   NA   NA   NA   NA    NA
    # [7,]    7    8    9   10   NA   NA   NA   NA   NA    NA
    # [8,]    8    9   10   NA   NA   NA   NA   NA   NA    NA
    # [9,]    9   10   NA   NA   NA   NA   NA   NA   NA    NA
    #[10,]   10   NA   NA   NA   NA   NA   NA   NA   NA    NA
    

    base R,我们可以使用embed

    out <- embed(c(x, x), 10)
    replace(out, lower.tri(out), NA)[, 10:1]
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    # [1,]    1    2    3    4    5    6    7    8    9    10
    # [2,]    2    3    4    5    6    7    8    9   10    NA
    # [3,]    3    4    5    6    7    8    9   10   NA    NA
    # [4,]    4    5    6    7    8    9   10   NA   NA    NA
    # [5,]    5    6    7    8    9   10   NA   NA   NA    NA
    # [6,]    6    7    8    9   10   NA   NA   NA   NA    NA
    # [7,]    7    8    9   10   NA   NA   NA   NA   NA    NA
    # [8,]    8    9   10   NA   NA   NA   NA   NA   NA    NA
    # [9,]    9   10   NA   NA   NA   NA   NA   NA   NA    NA
    #[10,]   10   NA   NA   NA   NA   NA   NA   NA   NA    NA
    #[11,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
    

    【讨论】:

    • @user63230 如果你检查class(out),这个类就是matrix
    • 对不起,我的意思是矩阵的名称...身份等?
    • @user63230 抱歉,我不确定它叫什么名字。
    【解决方案2】:

    这里的替代解决方案是使用base R

    f <- function(x) {
      y <- x:10
      length(y) <- 10
      return(y)
    }
    
    sapply(x, f)
    
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]    1    2    3    4    5    6    7    8    9    10
     [2,]    2    3    4    5    6    7    8    9   10    NA
     [3,]    3    4    5    6    7    8    9   10   NA    NA
     [4,]    4    5    6    7    8    9   10   NA   NA    NA
     [5,]    5    6    7    8    9   10   NA   NA   NA    NA
     [6,]    6    7    8    9   10   NA   NA   NA   NA    NA
     [7,]    7    8    9   10   NA   NA   NA   NA   NA    NA
     [8,]    8    9   10   NA   NA   NA   NA   NA   NA    NA
     [9,]    9   10   NA   NA   NA   NA   NA   NA   NA    NA
    [10,]   10   NA   NA   NA   NA   NA   NA   NA   NA    NA
    

    这更容易理解,并且不需要任何包。

    【讨论】:

    • 谢谢,但这不是很灵活,它只适用于1:10,假设你有x &lt;- rnorm(10),它会失败吗?
    • 我假设 x 是您给出的数字序列。肯定会更新我的代码。
    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多