【问题标题】:How to traverse matrix in diagonal strips and return the index of each position?如何在对角线中遍历矩阵并返回每个位置的索引?
【发布时间】:2016-07-02 23:14:17
【问题描述】:

有一个矩阵 N x N,我想在对角线中遍历这个矩阵并返回索引位置。

如果我有一个 4x4 矩阵,代码应该返回 (1,1); (1,2); (2,1); (1,3); (2,2); (3,1); (1,4); (2,3); (3,2); (4,1);等等

我正在尝试在 R Studio 中执行此操作

【问题讨论】:

    标签: r algorithm matrix traversal


    【解决方案1】:

    1) row(m) + col(m) 沿反向对角线是常数,在反向对角线内我们按行排序:

    m <- matrix(1:16, 4, 4) # test matrix
    
    m[order(row(m) + col(m), row(m))]
    ## [1]  1  5  2  9  6  3 13 10  7  4 14 11  8 15 12 16
    

    2) 不如 (1) 紧凑,但这里有一个变体,它使用相同的原理,但使用 outer 和回收而不是 rowcol

    k <- nrow(m)
    m[ order(outer(1:k, 1:k, "+") + 0:(k-1)/k) ]
    ## [1]  1  5  2  9  6  3 13 10  7  4 14 11  8 15 12 16
    

    【讨论】:

    • 令人印象深刻 - 如此简单的逻辑。
    【解决方案2】:

    您可以使用三个 for 循环 - 最外面的一个可以计算您在哪个对角线上。它从 1 变为 N*N - 1(每个 X 值一个对角线,每个 Y 值一个对角线,然后它们共享一个对角线,从 (1,N) 开始到 (N,1)。

    从那里您只需要使用对角计数器计算内部 2 个循环中的 X 和 Y 值

    【讨论】:

      【解决方案3】:

      R 的矩阵索引不需要循环。

      行列号是否相同对角线的一个测试是行+列是否相同。你也可以按照这个原则对矩阵的行列进行排序,所以使用两列矩阵来按顺序传递值:

       M <- matrix(1:16, 4, 4)
       idxs <- cbind( c(row(M)), c(col(M)) )
       imat <- idxs[ order( rowSums(idxs), idxs[,1] ), ] # returns two columns
                    # turns out you don't need to sort by both rows and columns
                    # but could have used rev(col(M)) as secondary sort
      
      >  imat
            [,1] [,2]
       [1,]    1    1
       [2,]    1    2
       [3,]    2    1
       [4,]    1    3
       [5,]    2    2
       [6,]    3    1
       [7,]    1    4
       [8,]    2    3
       [9,]    3    2
      [10,]    4    1
      [11,]    2    4
      [12,]    3    3
      [13,]    4    2
      [14,]    3    4
      [15,]    4    3
      [16,]    4    4
       M[ imat ]
       #[1]  1  5  2  9  6  3 13 10  7  4 14 11  8 15 12 16
      

      【讨论】:

      • 我明白...但是,问题是我不需要矩阵中的值,我需要值 (1,1),这意味着,我需要位置。
      • 这就是imat。发布的输出更明确。
      • 哦,太好了!谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多