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