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

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 和回收而不是 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。发布的输出更明确。 哦,太好了!谢谢。

以上是关于如何在对角线中遍历矩阵并返回每个位置的索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得矩阵中两个数字之间的对角线数字?

对角线遍历

在 Numpy 中生成对称矩阵

对角线、垂直线和水平线搜索矩阵形成一个点

用对角线索引矩阵中的上三角形或下三角形

从嵌套列表的子数组返回元素的索引