@@ -126,6 +126,17 @@ def fast_3d_circumcircle(points):
126
126
return center , radius
127
127
128
128
129
+ def fast_det (matrix ):
130
+ matrix = np .asarray (matrix , dtype = float )
131
+ if matrix .shape == (2 , 2 ):
132
+ return matrix [0 ][0 ] * matrix [1 ][1 ] - matrix [1 ][0 ] * matrix [0 ][1 ]
133
+ elif matrix .shape == (3 , 3 ):
134
+ a , b , c , d , e , f , g , h , i = matrix .ravel ()
135
+ return a * (e * i - f * h ) - b * (d * i - f * g ) + c * (d * h - e * g )
136
+ else :
137
+ return np .linalg .det (matrix )
138
+
139
+
129
140
def circumsphere (pts ):
130
141
dim = len (pts ) - 1
131
142
if dim == 2 :
@@ -140,9 +151,9 @@ def circumsphere(pts):
140
151
for i in range (1 , len (pts )):
141
152
r = np .delete (mat , i , 1 )
142
153
factor = (- 1 ) ** (i + 1 )
143
- center .append (factor * np . linalg . det (r ))
154
+ center .append (factor * fast_det (r ))
144
155
145
- a = np . linalg . det (np .delete (mat , 0 , 1 ))
156
+ a = fast_det (np .delete (mat , 0 , 1 ))
146
157
center = [x / (2 * a ) for x in center ]
147
158
148
159
x0 = pts [0 ]
@@ -227,7 +238,7 @@ def simplex_volume_in_embedding(vertices) -> float:
227
238
sq_dists_mat = scipy .spatial .distance .squareform (bordered )
228
239
229
240
coeff = - (- 2 ) ** (num_verts - 1 ) * factorial (num_verts - 1 ) ** 2
230
- vol_square = np . linalg . det (sq_dists_mat ) / coeff
241
+ vol_square = fast_det (sq_dists_mat ) / coeff
231
242
232
243
if vol_square < 0 :
233
244
if abs (vol_square ) < 1e-15 :
@@ -587,7 +598,7 @@ def volume(self, simplex):
587
598
prefactor = np .math .factorial (self .dim )
588
599
vertices = np .array (self .get_vertices (simplex ))
589
600
vectors = vertices [1 :] - vertices [0 ]
590
- return float (abs (np . linalg . det (vectors )) / prefactor )
601
+ return float (abs (fast_det (vectors )) / prefactor )
591
602
592
603
def volumes (self ):
593
604
return [self .volume (sim ) for sim in self .simplices ]
0 commit comments