距離矩陣計算
給定m × n階矩陣x,滿足x = [x 1 , x 2 , … x n ],這裡第i列向量是m維向量。
求n × n矩陣d,使得d ij = ||x i - x j || 2
通過使用向量和矩陣操作,減少迴圈來優化執行時間
import numpy as np
import numpy.linalg as la
import time
x = np.array(
[range(0
,500),
range
(500
,1000)]
)m,n = x.shape
"""方法1:標準方法計算d ij
d[i, j] = numpy.linalg.norm(x[:, i], x[:, j) ** 2
"""t = time.time(
)d = np.zeros(
[n,n]
)# 儲存結果
for i in
range
(n):
for j in
range
(i+1
,n):
d = x[
:,i]
-x[:
,j] d[i,j]
= la.norm(d)**2
# 計算l2範數的平方
d[j,i]
= d[i,j]
print
(time.time(
)-t)
# 3.41
"""方法2:利用dot計算dij
d = x[:, i] - x[:, j] d[i, j] = numpy.dot(d, d)
"""t = time.time(
)d = np.zeros(
[n,n]
)# 儲存結果
for i in
range
(n):
for j in
range
(i+1
,n):
d = x[
:,i]
-x[:
,j] d[i,j]
= np.dot(d,d)
d[j,i]
= d[i,j]
print
(time.time(
)-t)
# 0.95
"""方法3:減少dot呼叫次數
• d ij = (x i - x j ) t (x i - x j ) = x i t x i - 2x i t x j + x j t x j
• g = numpy.dot(x.t, x)
• d ij = g ii - 2g ij + g jj
"""t = time.time(
)d = np.zeros(
[n,n]
)# 儲存結果
g = np.dot(x.t,x)
for i in
range
(n):
for j in
range
(i+1
,n):
d[i,j]
= g[i,i]-2
*g[i,j]
+g[j,j]
d[j,i]
= d[i,j]
print
(time.time(
)-t)
# 0.27
""" 方法4: 利用重複操作替代外部迴圈
• 在方法3的基礎上,將d表達為h + k - 2g
• h ij = g ii , k ij = g jj
• h = numpy.title(np.diag(g), (n, 1))
• k = h t
• d = h + h t - 2g
"""t = time.time(
)d = np.zeros(
[n,n]
)# 儲存結果
g = np.dot(x.t,x)
c = np.diag(g)
h = np.tile(c,
(n,1))
# tile(a,n),功能是將陣列a重複n次
d = h+h.t-2*g
print
(time.time(
)-t)
# 0.005
優化計算相似度矩陣
任務 現有特徵矩陣x r n fx in r x rn f n為樣本個數,f為特徵大小,需要計算相似度矩陣a aa,aij aji a a aij a ji 為第i個樣本和第j個樣本的相似度,利用歐式距離求解兩個樣本間的距離 a ij aji f 1f x if x jf 2 a a sum x x...
GPU計算矩陣相乘(未優化)
include define len 10 define block 10 define thread 32 global void multi 0 int a,int b,int c c id sum int main cudamemcpy a,a,memsize,cudamemcpyhostto...
單應性矩陣Homography計算和優化
單應性矩陣,是用來描述兩個平面之間的變換關係,是乙個3x3的齊次矩陣。圖上的4個綠色的圈,兩兩可以對應,h可以表達第一張圖變換到第二張圖的轉換關係。具體的表示式 aa表示尺度資訊,h1 h9h 1 h 9 h1 h9 表示h hh矩陣,h hh矩陣有8個自由度,h9 1h 9 1 h9 1,所以只需...