Lines 163-171
lapack_Cholesky(fptype* a, size_t a_step, int m, fptype* b, size_t b_step, int n
Link Here
|
163 |
if(n == 1 && b_step == sizeof(fptype)) |
163 |
if(n == 1 && b_step == sizeof(fptype)) |
164 |
{ |
164 |
{ |
165 |
if(typeid(fptype) == typeid(float)) |
165 |
if(typeid(fptype) == typeid(float)) |
166 |
sposv_(L, &m, &n, (float*)a, &lda, (float*)b, &m, &lapackStatus); |
166 |
LAPACK_FUNC(sposv)(L, &m, &n, (float*)a, &lda, (float*)b, &m, &lapackStatus); |
167 |
else if(typeid(fptype) == typeid(double)) |
167 |
else if(typeid(fptype) == typeid(double)) |
168 |
dposv_(L, &m, &n, (double*)a, &lda, (double*)b, &m, &lapackStatus); |
168 |
LAPACK_FUNC(dposv)(L, &m, &n, (double*)a, &lda, (double*)b, &m, &lapackStatus); |
169 |
} |
169 |
} |
170 |
else |
170 |
else |
171 |
{ |
171 |
{ |
Lines 174-182
lapack_Cholesky(fptype* a, size_t a_step, int m, fptype* b, size_t b_step, int n
Link Here
|
174 |
transpose(b, ldb, tmpB, m, m, n); |
174 |
transpose(b, ldb, tmpB, m, m, n); |
175 |
|
175 |
|
176 |
if(typeid(fptype) == typeid(float)) |
176 |
if(typeid(fptype) == typeid(float)) |
177 |
sposv_(L, &m, &n, (float*)a, &lda, (float*)tmpB, &m, &lapackStatus); |
177 |
LAPACK_FUNC(sposv)(L, &m, &n, (float*)a, &lda, (float*)tmpB, &m, &lapackStatus); |
178 |
else if(typeid(fptype) == typeid(double)) |
178 |
else if(typeid(fptype) == typeid(double)) |
179 |
dposv_(L, &m, &n, (double*)a, &lda, (double*)tmpB, &m, &lapackStatus); |
179 |
LAPACK_FUNC(dposv)(L, &m, &n, (double*)a, &lda, (double*)tmpB, &m, &lapackStatus); |
180 |
|
180 |
|
181 |
transpose(tmpB, m, b, ldb, n, m); |
181 |
transpose(tmpB, m, b, ldb, n, m); |
182 |
delete[] tmpB; |
182 |
delete[] tmpB; |
Lines 185-193
lapack_Cholesky(fptype* a, size_t a_step, int m, fptype* b, size_t b_step, int n
Link Here
|
185 |
else |
185 |
else |
186 |
{ |
186 |
{ |
187 |
if(typeid(fptype) == typeid(float)) |
187 |
if(typeid(fptype) == typeid(float)) |
188 |
spotrf_(L, &m, (float*)a, &lda, &lapackStatus); |
188 |
LAPACK_FUNC(spotrf)(L, &m, (float*)a, &lda, &lapackStatus); |
189 |
else if(typeid(fptype) == typeid(double)) |
189 |
else if(typeid(fptype) == typeid(double)) |
190 |
dpotrf_(L, &m, (double*)a, &lda, &lapackStatus); |
190 |
LAPACK_FUNC(dpotrf)(L, &m, (double*)a, &lda, &lapackStatus); |
191 |
} |
191 |
} |
192 |
|
192 |
|
193 |
if(lapackStatus == 0) *info = true; |
193 |
if(lapackStatus == 0) *info = true; |
Lines 227-243
lapack_SVD(fptype* a, size_t a_step, fptype *w, fptype* u, size_t u_step, fptype
Link Here
|
227 |
} |
227 |
} |
228 |
|
228 |
|
229 |
if(typeid(fptype) == typeid(float)) |
229 |
if(typeid(fptype) == typeid(float)) |
230 |
sgesdd_(mode, &m, &n, (float*)a, &lda, (float*)w, (float*)u, &ldu, (float*)vt, &ldv, (float*)&work1, &lwork, iworkBuf, info); |
230 |
LAPACK_FUNC(sgesdd)(mode, &m, &n, (float*)a, &lda, (float*)w, (float*)u, &ldu, (float*)vt, &ldv, (float*)&work1, &lwork, iworkBuf, info); |
231 |
else if(typeid(fptype) == typeid(double)) |
231 |
else if(typeid(fptype) == typeid(double)) |
232 |
dgesdd_(mode, &m, &n, (double*)a, &lda, (double*)w, (double*)u, &ldu, (double*)vt, &ldv, (double*)&work1, &lwork, iworkBuf, info); |
232 |
LAPACK_FUNC(dgesdd)(mode, &m, &n, (double*)a, &lda, (double*)w, (double*)u, &ldu, (double*)vt, &ldv, (double*)&work1, &lwork, iworkBuf, info); |
233 |
|
233 |
|
234 |
lwork = (int)round(work1); //optimal buffer size |
234 |
lwork = (int)round(work1); //optimal buffer size |
235 |
fptype* buffer = new fptype[lwork + 1]; |
235 |
fptype* buffer = new fptype[lwork + 1]; |
236 |
|
236 |
|
237 |
if(typeid(fptype) == typeid(float)) |
237 |
if(typeid(fptype) == typeid(float)) |
238 |
sgesdd_(mode, &m, &n, (float*)a, &lda, (float*)w, (float*)u, &ldu, (float*)vt, &ldv, (float*)buffer, &lwork, iworkBuf, info); |
238 |
LAPACK_FUNC(sgesdd)(mode, &m, &n, (float*)a, &lda, (float*)w, (float*)u, &ldu, (float*)vt, &ldv, (float*)buffer, &lwork, iworkBuf, info); |
239 |
else if(typeid(fptype) == typeid(double)) |
239 |
else if(typeid(fptype) == typeid(double)) |
240 |
dgesdd_(mode, &m, &n, (double*)a, &lda, (double*)w, (double*)u, &ldu, (double*)vt, &ldv, (double*)buffer, &lwork, iworkBuf, info); |
240 |
LAPACK_FUNC(dgesdd)(mode, &m, &n, (double*)a, &lda, (double*)w, (double*)u, &ldu, (double*)vt, &ldv, (double*)buffer, &lwork, iworkBuf, info); |
241 |
|
241 |
|
242 |
if(!(flags & CV_HAL_SVD_NO_UV)) |
242 |
if(!(flags & CV_HAL_SVD_NO_UV)) |
243 |
transpose_square_inplace(vt, ldv, n); |
243 |
transpose_square_inplace(vt, ldv, n); |
Lines 288-305
lapack_QR(fptype* a, size_t a_step, int m, int n, int k, fptype* b, size_t b_ste
Link Here
|
288 |
if (k == 1 && b_step == sizeof(fptype)) |
288 |
if (k == 1 && b_step == sizeof(fptype)) |
289 |
{ |
289 |
{ |
290 |
if (typeid(fptype) == typeid(float)) |
290 |
if (typeid(fptype) == typeid(float)) |
291 |
sgels_(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)b, &m, (float*)&work1, &lwork, info); |
291 |
LAPACK_FUNC(sgels)(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)b, &m, (float*)&work1, &lwork, info); |
292 |
else if (typeid(fptype) == typeid(double)) |
292 |
else if (typeid(fptype) == typeid(double)) |
293 |
dgels_(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)b, &m, (double*)&work1, &lwork, info); |
293 |
LAPACK_FUNC(dgels)(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)b, &m, (double*)&work1, &lwork, info); |
294 |
|
294 |
|
295 |
lwork = cvRound(work1); //optimal buffer size |
295 |
lwork = cvRound(work1); //optimal buffer size |
296 |
std::vector<fptype> workBufMemHolder(lwork + 1); |
296 |
std::vector<fptype> workBufMemHolder(lwork + 1); |
297 |
fptype* buffer = &workBufMemHolder.front(); |
297 |
fptype* buffer = &workBufMemHolder.front(); |
298 |
|
298 |
|
299 |
if (typeid(fptype) == typeid(float)) |
299 |
if (typeid(fptype) == typeid(float)) |
300 |
sgels_(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)b, &m, (float*)buffer, &lwork, info); |
300 |
LAPACK_FUNC(sgels)(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)b, &m, (float*)buffer, &lwork, info); |
301 |
else if (typeid(fptype) == typeid(double)) |
301 |
else if (typeid(fptype) == typeid(double)) |
302 |
dgels_(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)b, &m, (double*)buffer, &lwork, info); |
302 |
LAPACK_FUNC(dgels)(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)b, &m, (double*)buffer, &lwork, info); |
303 |
} |
303 |
} |
304 |
else |
304 |
else |
305 |
{ |
305 |
{ |
Lines 309-326
lapack_QR(fptype* a, size_t a_step, int m, int n, int k, fptype* b, size_t b_ste
Link Here
|
309 |
transpose(b, ldb, tmpB, m, m, k); |
309 |
transpose(b, ldb, tmpB, m, m, k); |
310 |
|
310 |
|
311 |
if (typeid(fptype) == typeid(float)) |
311 |
if (typeid(fptype) == typeid(float)) |
312 |
sgels_(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)tmpB, &m, (float*)&work1, &lwork, info); |
312 |
LAPACK_FUNC(sgels)(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)tmpB, &m, (float*)&work1, &lwork, info); |
313 |
else if (typeid(fptype) == typeid(double)) |
313 |
else if (typeid(fptype) == typeid(double)) |
314 |
dgels_(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)tmpB, &m, (double*)&work1, &lwork, info); |
314 |
LAPACK_FUNC(dgels)(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)tmpB, &m, (double*)&work1, &lwork, info); |
315 |
|
315 |
|
316 |
lwork = cvRound(work1); //optimal buffer size |
316 |
lwork = cvRound(work1); //optimal buffer size |
317 |
std::vector<fptype> workBufMemHolder(lwork + 1); |
317 |
std::vector<fptype> workBufMemHolder(lwork + 1); |
318 |
fptype* buffer = &workBufMemHolder.front(); |
318 |
fptype* buffer = &workBufMemHolder.front(); |
319 |
|
319 |
|
320 |
if (typeid(fptype) == typeid(float)) |
320 |
if (typeid(fptype) == typeid(float)) |
321 |
sgels_(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)tmpB, &m, (float*)buffer, &lwork, info); |
321 |
LAPACK_FUNC(sgels)(mode, &m, &n, &k, (float*)tmpA, &ldtmpA, (float*)tmpB, &m, (float*)buffer, &lwork, info); |
322 |
else if (typeid(fptype) == typeid(double)) |
322 |
else if (typeid(fptype) == typeid(double)) |
323 |
dgels_(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)tmpB, &m, (double*)buffer, &lwork, info); |
323 |
LAPACK_FUNC(dgels)(mode, &m, &n, &k, (double*)tmpA, &ldtmpA, (double*)tmpB, &m, (double*)buffer, &lwork, info); |
324 |
|
324 |
|
325 |
transpose(tmpB, m, b, ldb, k, m); |
325 |
transpose(tmpB, m, b, ldb, k, m); |
326 |
} |
326 |
} |