我想在列“1”中找到重复元素的位置,在指定矩阵“x”中找到列“2”(矩阵“x”具有nx3大小(“n”是最大数字)在列“1”和列“2”之间,在下一个例子中是max(3,4)= 4)),然后在新矩阵“z”的主对角线(数字1到“n”)中(矩阵“z”具有“n”x“n”大小)对每列的值(除了具有等于零的值的列除外)的总和,并将相应的值放在相应列中的非对角线上。这是矩阵“x”的一个例子:
1 2 3
x= 1 [[1,2,4],
2 [1,3,2],
3 [2,3,1],
4 [3,4,5]]
矩阵“z”是对称矩阵,意味着例如元素z [1,2]等于z [2,1]并且元素z [1,3]等于z [3,1]这是矩阵“z”的结构:
z= [[z[1],z[1 to 2],z[1 to 3],z[1 to 4]],
[z[2 to 1],z[2],z[2 to 3],z[2 to 4]],
[[z[3 to 1],z[3 to 2],z[3],z[3 to 4]],
[[z[4 to 1],z[4 to 2],z[4 to 3],z[4]]
对角线主体中的元素(对于此示例是):
z[1]=z[1 to 2]+z[1 to 3]+z[1 to 4]
z[2]=z[2 to 1]+z[2 to 3]+z[2 to 4]
z[3]=z[3 to 1]+z[3 to 2]+z[3 to 4]
z[4]=z[4 to 1]+z[4 to 2]+z[4 to 3]
所需的矩阵(对于此示例)是:
z= [[4+2=6,4,2,0],
[4,4+1=5,1,0],
[2,1,2+1+5=8,5],
[0,0,5,5]]
注意:矩阵“z”中的零表示是否与其他数字没有关联。在此示例中,数字“4”仅与数字“3”连接(值为5)。然后,数字4与数字1和数字2的连接为零。
感谢。
答案 0 :(得分:0)
如果您引入图论理论术语,您的问题就会得到澄清。您的x
可以被视为描述加权图。像[1,3,2]
这样的行可以解释为描述连接节点1和节点3的权重2的边缘的存在。矩阵z
包含以下信息:
1)对于每个节点i
,相应的对角线条目是与i
一起发生的所有边的权重之和。
2)对于每对不同的节点i
和j
,如果节点未连接,则z
的相应条目为0
,或者权重为连接i
和j
的边(如果有的话)(如果有多个边,则为权重的总和)。
鉴于这种解释,事情很容易。以下假设x
中的节点以1
开头。请注意,即使图形从1开始,结果矩阵也是从0开始的,因此要查找从节点2到节点3的权重,您需要z[1][2]
:
def makeMatrix(edges):
n = max(max(edge[:2]) for edge in edges)
z = [[0]*n for i in range(n)]
for edge in edges:
i,j,w = edge
z[i-1][i-1] += w
z[j-1][j-1] += w
z[i-1][j-1] += w
z[j-1][i-1] += w
return z
以下有助于调试:
def pprint(matrix):
for row in matrix:
print(' '.join(str(i) for i in row))
例如,
>>> x = [[1,2,4],[1,3,2],[2,3,1],[3,4,5]]
>>> z = makeMatrix(x)
>>> pprint(z)
6 4 2 0
4 5 1 0
2 1 8 5
0 0 5 5