从它的索引

时间:2017-02-25 17:14:15

标签: algorithm matrix

如果我想用以下格式的数字填充矩阵(请注意[1-25]中的数字序列)

1 | 3 | 6 | 10 | 15
2 | 5 | 9 | 14 | 19 
4 | 8 | 13| 18 | 22
7 | 12| 17| 21 | 24
11| 16| 20| 23 | 25

我的问题是:有没有办法从它的索引计算单元格值而不将所有矩阵单元循环到目标单元格?

例如:给定i = 2,j = 2(从i& j => 13计算单元格值)

为什么我需要这个?在我的情况下,我有大尺寸的大型矩阵,上面的例子仅用于演示目的。

1 个答案:

答案 0 :(得分:1)

你必须记住1 + 2 + 3 + ... + N = N *(N + 1)/ 2。 这是Python的解决方案(我很确定我已经回答了这个问题,但我无法找到它):

def diag(i, j, N):
    if i+j < N:
        return (i+j)*(i+j+1)/2 + i + 1
    else:
        return N*N - diag(N-i-1, N-j-1, N) + 1

然后:

>>> [[diag(i,j, N) for i in range(N)] for j in range(N)]
[[1, 3, 6, 10, 15],
 [2, 5, 9, 14, 19],
 [4, 8, 13, 18, 22],
 [7, 12, 17, 21, 24],
 [11, 16, 20, 23, 25]]

一些解释,

  1. 坐标i,j中的单元格位于对角线i + j

  2. 如果i + j <上,则单元格位于上半部分。 Ñ

  3. 因此,根据该评论,对角线的第一个条目是(i + j)*(i + j + 1)/ 2 + 1

  4. 因此上半部细胞的公式

  5. 对于下半部细胞,我只是对称坐标。