我想在python 2.7中的代码下面创建一个对角矩阵
def diag(steps):
'''
steps : a positive integer
'''
matrix = [[0]*steps]*steps # matrix of the order step x step
for i in range(steps + 1):
matrix[i][i] = i + 1 # i'th' element of 'i'th row
return matrix
例如:如果step = 3,我应该得到[[1,0,0],[0,2,0],[0,0,3]]。 但我得到[[1,2,3],[1,2,3],[1,2,3]] 任何人都可以帮我解决这个错误,请告诉我的逻辑有什么问题吗?
答案 0 :(得分:1)
通过乘以数组,您不会创建具有三个不同数组的矩阵。您创建对同一数组的多个引用。
示例:
struct ItemExist: public std::binary_function< Item*, int, bool > {
bool operator () ( const Item *sc, const int &number ) const {
return sc->orderNumber== number;
}
};
你知道吗?每个3阵列中的每个第一个元素现在都是8,而不仅仅是b [0] [0]。那是因为它们都是同一个对象。
你必须改变
> a = [2,2,2]
> b = [a]*3
> print b
[[2, 2, 2], [2, 2, 2], [2, 2, 2]]
> a[1] = 4
> print b
[[2, 4, 2], [2, 4, 2], [2, 4, 2]]
> b[0][0] = 8
> print b
[[8, 4, 2], [8, 4, 2], [8, 4, 2]]
到
matrix = [[0]*steps]*steps
答案 1 :(得分:0)
1)为方便起见,您可以考虑使用numpy
,它允许以更“数学”的方式工作,而不是使用python的列表。
在您的情况下,您可能需要查看numpy.diag(vector)
创建len(vector)xlen(vector)
矩阵matrix[i][i] = vector[i]
根据您的需要,您可以使用numpy:
import numpy as np
matrix = np.diag( list(range(1, steps+1))
这就是全部
2)要回答你的确切问题(如果由于某些原因你不能使用numpy),你可以缩短它:
def diag(steps):
matrix = [ [0]*i+[i+1]+[0]*(steps-i-1) for i in range(steps) ]
return matrix