将一个一维数组A的下标映射为上三角阵的实现方式如下:
import math
import sys
def calculate_coordinates(n, k):
i = n - 1 - math.floor(math.sqrt(-8*k + 4*n*(n+1)-7)/2.0 - 0.5)
j = k + math.floor(i - n*(n+1)/2 + (n-i)*(n-i+1)/2)
return i, j
def cal(n, k):
matrix = [['x' for _ in range(n)] for _ in range(n)]
for t in range(n*(n+1)//2):
i, j = calculate_coordinates(n, t)
matrix[i][j] = str(t)
i_k, j_k = calculate_coordinates(n, k)
matrix[i_k][j_k] = '[' + matrix[i_k][j_k] + ']'
for row in matrix:
print(' '.join(['{:>4}'.format(item) for item in row]))
def triu_indices(n):
indices = [(i, j) for i in range(n) for j in range(i, n)]
return indices
def cal2(n, k):
indices = triu_indices(n)
matrix = [['x' for _ in range(n)] for _ in range(n)]
for t in range(n*(n+1)//2):
i, j = (indices[t][0], indices[t][1])
matrix[i][j] = str(t)
i_k, j_k = (indices[k][0], indices[k][1])
matrix[i_k][j_k] = '[' + matrix[i_k][j_k] + ']'
for row in matrix:
print(' '.join(['{:>4}'.format(item) for item in row]))
if __name__ == "__main__":
n = int(sys.argv[1])
k = int(sys.argv[2])
cal(n, k)
运行以下命令,即可生成一个上三角阵,其中5表示生成上三角阵的维度为5, 3表示将数组A的下标3对应的上三角阵的坐标标记出来,用于验证准确性。另外,第二个参数(3)不能大于n(n+1)/2,其中n为上三角阵的维度。
python linear.py 5 3
0 1 2 [3] 4
x 5 6 7 8
x x 9 10 11
x x x 12 13
x x x x 14
以上是包含对角线的上三角阵的生成方式。如果不包含对角线,则其生成方式如下:
import math
import sys
def calculate_coordinates(n, k):
i = n - 2 - math.floor(math.sqrt(-8*k + 4*n*(n-1)-7)/2.0 - 0.5)
j = k + math.floor(i + 1 - n*(n-1)/2 + (n-i)*(n-i-1)/2)
return i, j
def cal(n, k):
matrix = [['x' for _ in range(n)] for _ in range(n)]
for t in range(n*(n-1)//2):
i, j = calculate_coordinates(n, t)
matrix[i][j] = str(t)
i_k, j_k = calculate_coordinates(n, k)
matrix[i_k][j_k] = '[' + matrix[i_k][j_k] + ']'
for row in matrix:
print(' '.join(['{:>4}'.format(item) for item in row]))
def triu_indices(n):
indices = [(i, j) for i in range(n) for j in range(i+1, n)]
return indices
def cal2(n, k):
indices = triu_indices(n)
matrix = [['x' for _ in range(n)] for _ in range(n)]
for t in range(n*(n-1)//2):
i, j = (indices[t][0], indices[t][1])
matrix[i][j] = str(t)
i_k, j_k = (indices[k][0], indices[k][1])
matrix[i_k][j_k] = '[' + matrix[i_k][j_k] + ']'
for row in matrix:
print(' '.join(['{:>4}'.format(item) for item in row]))
if __name__ == "__main__":
n = int(sys.argv[1])
k = int(sys.argv[2])
cal2(n, k)
运行同样的命令生成:
x 0 1 2 [3]
x x 4 5 6
x x x 7 8
x x x x 9
x x x x x