我正在尋找一種方法來構建 1 和 -1 的矩陣平方根串列。只對 2 到 4 維感興趣,我什至不需要一套完整的,只需要一個實用的可用的(意味著我可以在某個時候停止回圈)。這是我(非常)低效的解決方案
def racines(n, dim, field='real'):
if field == 'real':
unites = [1, 0, -1]
elif field == 'complex':
unites = [1, 0, -1, 1j, -1j]
if dim == 2:
liste = [np.array([[a,b], [c,d]]) for a in unites
for b in unites for c in unites
for d in unites]
elif dim == 3:
liste = [np.array([[a, b, c], [d, e, f], [g, h, i]])
for a in unites for b in unites for c in unites
for d in unites for e in unites for f in unites
for g in unites for h in unites for i in unites]
elif dim == 4:
liste = [np.array([[a,b,c,d], [e,f,g,h], [i,j,k,l], [m,o,p,q]])
for a in unites for b in unites for c in unites for d in unites
for e in unites for f in unites for g in unites for h in unites
for i in unites for j in unites for k in unites for l in unites
for m in unites for o in unites for p in unites for q in unites]
liste = [m for m in liste if np.linalg.det(m) != 0]
liste = [m for m in liste if np.array_equal(np.matmul(m, m), np.identity(dim, dtype='int')*n)]
return(liste)
運行良好,直到 4d,當然它變得太多處理......如何讓它更快?
uj5u.com熱心網友回復:
你可以遞回地做。例如,如果我想要 0 到 4 之間的 n 個數字的串列,您可以使用
def get_lists(size, max_it, accumulator = [], lists = []):
if size ==0:
lists.append(accumulator)
else:
for i in range(5):
if len(lists) == max_it:
break
l = accumulator.copy()
l.append(i)
get_lists(size-1,max_it, l, lists)
def lists(size,max_it=-1):
l = []
get_lists(size,max_it, [], l)
return l
print(lists(3,10))
使用 max_it 您想要的不同串列的數量(如果您想要所有串列,則設定為 -1)
uj5u.com熱心網友回復:
對于那些需要它的人,這就是訣竅。仍然不漂亮,但它在 4d 中的運行速度要快得多
def racines(n, dim, field='real'):
unites = [1, 0, -1]
if field == 'complex':
unites = [1j, -1j]
elif field != 'real':
print('Unknown field !')
return([])
if dim == 2:
liste = [np.array([[a,b], [c,d]]) for a in unites
for b in unites for c in unites
for d in unites]
elif dim == 3:
liste = [np.array([[a, b, c], [d, e, f], [g, h, i]])
for a in unites for b in unites for c in unites
for d in unites for e in unites for f in unites
for g in unites for h in unites for i in unites]
elif dim == 4:
roots_2d = racines(n, 2, field=field)
neg_roots_2d = racines(-n, 2, field=field)
other = [np.identity(2, dtype='int'), np.identity(2, dtype='int')*-1, np.zeros([2,2], dtype='int')]
unites = roots_2d neg_roots_2d other
liste = [np.hstack([np.vstack([a,b]), np.vstack([c,d])])
for a in unites for b in unites for c in unites for d in unites]
else:
print('No can do !')
return([])
liste = [m for m in liste if np.linalg.det(m) != 0]
liste = [m for m in liste if np.array_equal(np.matmul(m, m), np.identity(dim, dtype='int')*n)]
return(liste)
# res = racines(1, 4, field='real') # 2.43s
# res = racines(1, 4, field='complex') # 2min 18s
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/352632.html
上一篇:Python-`statistics.stdev()`在Numpy陣列上的行為
下一篇:為什么我的運動系統會隨機中斷?
