如何在对角线中遍历矩阵并返回每个位置的索引?
Posted
技术标签:
【中文标题】如何在对角线中遍历矩阵并返回每个位置的索引?【英文标题】: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 中执行此操作
【问题讨论】:
【参考方案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
和回收而不是 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
【讨论】:
令人印象深刻 - 如此简单的逻辑。【参考方案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
。发布的输出更明确。
哦,太好了!谢谢。以上是关于如何在对角线中遍历矩阵并返回每个位置的索引?的主要内容,如果未能解决你的问题,请参考以下文章