File wellmet/convex_hull.py changed (mode: 100644) (index c6a9832..8ed6168) |
... |
... |
def _get_nD_orth_basis_from_normals(A, b): |
187 |
187 |
to_fire = np.nanargmax(b) |
to_fire = np.nanargmax(b) |
188 |
188 |
a = A[to_fire] |
a = A[to_fire] |
189 |
189 |
|
|
190 |
|
Acos = a * A |
|
191 |
190 |
|
|
192 |
191 |
#č QR rozklad jede po sloupcich |
#č QR rozklad jede po sloupcich |
193 |
192 |
basis_T = np.empty((ndim, ndim)) |
basis_T = np.empty((ndim, ndim)) |
194 |
193 |
basis_T[:,0] = a |
basis_T[:,0] = a |
195 |
194 |
|
|
196 |
195 |
#č skalarní součín |
#č skalarní součín |
197 |
|
cos = np.sum(Acos, axis=1) |
|
|
196 |
|
cos = A @ a |
198 |
197 |
bcos = b * (1 + np.abs(cos)) |
bcos = b * (1 + np.abs(cos)) |
199 |
198 |
|
|
200 |
199 |
for i in range(1, ndim-2): |
for i in range(1, ndim-2): |
|
... |
... |
def _get_nD_orth_basis_from_normals(A, b): |
204 |
203 |
|
|
205 |
204 |
#č QR rozklad komplikuje život transponovanim matic |
#č QR rozklad komplikuje život transponovanim matic |
206 |
205 |
basis_T[:,i] = next_vector |
basis_T[:,i] = next_vector |
207 |
|
#č není hezky pouštět v cyklu QR rozklad, ale zatím tak |
|
208 |
|
##č (jednotka dočasnosti - jeden furt) |
|
209 |
|
basis_T, __R = np.linalg.qr(basis_T) |
|
|
206 |
|
basis_T[:, :i+1], __R = np.linalg.qr(basis_T[:, :i+1]) |
210 |
207 |
|
|
211 |
208 |
next_orth_vector = basis_T[:,i] |
next_orth_vector = basis_T[:,i] |
212 |
209 |
|
|
213 |
|
Acos = next_orth_vector * A |
|
214 |
|
|
|
215 |
210 |
#č skalarní součín |
#č skalarní součín |
216 |
|
cos = np.sum(Acos, axis=1) |
|
217 |
|
bcos = bcos * (1 + np.abs(cos)) |
|
218 |
|
|
|
219 |
|
#č vzít ndim-1 nejbližších ke středu hyperrovin |
|
220 |
|
#č (nepotřebuje nejlepší řešení, potřebuji jen porazit draka) |
|
221 |
|
#_dim = dim - 1 |
|
222 |
|
#č předpokládám, že vzdálenost je záporná |
|
223 |
|
#č (hledáme zde tedy ndim největších čísel) |
|
224 |
|
#index = np.argpartition(bcos, -_dim)[-_dim:] |
|
225 |
|
# sort |
|
226 |
|
#č dostaneme index indexů |
|
227 |
|
#č argsort třídí od nějměnšího k většímu |
|
228 |
|
#index2 = np.argsort(-bcos[index]) |
|
|
211 |
|
cos = A @ next_orth_vector |
|
212 |
|
bcos *= (1 + np.abs(cos)) |
|
213 |
|
|
229 |
214 |
|
|
230 |
215 |
to_fire = np.nanargmax(bcos) |
to_fire = np.nanargmax(bcos) |
231 |
216 |
#č předposlední vektor |
#č předposlední vektor |
|
... |
... |
def _get_nD_orth_basis_from_normals(A, b): |
234 |
219 |
#č a už ready. Poslední vektor je určen předchozími |
#č a už ready. Poslední vektor je určen předchozími |
235 |
220 |
basis_T, __R = np.linalg.qr(basis_T) |
basis_T, __R = np.linalg.qr(basis_T) |
236 |
221 |
|
|
237 |
|
#č udělám to zjednodušeně - zvolim první největší vektor |
|
238 |
|
#č a přídam k tomu co nejlepší nejortogonálnější další |
|
239 |
|
#index3 = np.concatenate(([to_fire], index[index2])) |
|
240 |
|
#č pomocí indexu indexů z normálových (směrových) vektorů uděláme maticu |
|
241 |
|
#basis = hull.A[index3] |
|
242 |
|
|
|
243 |
222 |
#č QR rozklad jede po sloupcich |
#č QR rozklad jede po sloupcich |
244 |
223 |
#č co jsem viděl, numpy matici Q normalizuje |
#č co jsem viděl, numpy matici Q normalizuje |
245 |
224 |
#č a první sloupec zůstavá (skoro) tím samým, co byl před tím |
#č a první sloupec zůstavá (skoro) tím samým, co byl před tím |