如何遍历对角线条中的矩阵并返回每个位置的索引?

时间:2016-03-16 20:37:23

标签: r algorithm matrix traversal

有一个矩阵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中执行此操作

3 个答案:

答案 0 :(得分:3)

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和循环而不是row和{{1 }}:

col

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

关于行,列号是否是相同对角线的一个测试是行+ col是相同的。您还可以按此原则订购矩阵的行和列,因此请使用两列矩阵按顺序传递值:

 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