Skip to content

Commit 2952f86

Browse files
committed
spectral_angles is ~30x faster using einsum.
1 parent 6ee2bed commit 2952f86

File tree

1 file changed

+5
-15
lines changed

1 file changed

+5
-15
lines changed

spectral/algorithms/algorithms.py

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,23 +1333,13 @@ def spectral_angles(data, members):
13331333
assert members.shape[1] == data.shape[2], \
13341334
'Matrix dimensions are not aligned.'
13351335

1336-
(M, N, B) = data.shape
13371336
m = np.array(members, np.float64)
1338-
C = m.shape[0]
1339-
1340-
# Normalize endmembers
1341-
for i in range(C):
1342-
m[i] /= np.sqrt(m[i].dot(m[i]))
1337+
m /= np.sqrt(np.einsum('ij,ij->i', m, m))[:, np.newaxis]
13431338

1344-
angles = np.zeros((M, N, C), np.float64)
1345-
1346-
for i in range(M):
1347-
for j in range(N):
1348-
v = data[i, j].astype(float)
1349-
v = v / np.sqrt(v.dot(v))
1350-
for k in range(C):
1351-
angles[i, j, k] = np.clip(v.dot(m[k]), -1, 1)
1352-
return np.arccos(angles)
1339+
norms = np.sqrt(np.einsum('ijk,ijk->ij', data, data))
1340+
dots = np.einsum('ijk,mk->ijm', data, m)
1341+
dots = np.clip(dots / norms[:, :, np.newaxis], -1, 1)
1342+
return np.arccos(dots)
13531343

13541344
def msam(data, members):
13551345
'''Modified SAM scores according to Oshigami, et al [1]. Endmembers are

0 commit comments

Comments
 (0)