【发布时间】: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
有一个矩阵 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) 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 和 col:
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
【讨论】:
您可以使用三个 for 循环 - 最外面的一个可以计算您在哪个对角线上。它从 1 变为 N*N - 1(每个 X 值一个对角线,每个 Y 值一个对角线,然后它们共享一个对角线,从 (1,N) 开始到 (N,1)。
从那里您只需要使用对角计数器计算内部 2 个循环中的 X 和 Y 值
【讨论】:
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
【讨论】:
imat。发布的输出更明确。