25 #include "dspl_internal.h"
31 #ifdef DOXYGEN_ENGLISH
87 #ifdef DOXYGEN_RUSSIAN
157 double *rwork = (
double*)malloc(n*
sizeof(
double));
159 zgees_(
"N",
"N", NULL, &n, a, &n, &sdim, v, NULL, &ldvs, work, &lwork,
178 #ifdef DOXYGEN_ENGLISH
203 #ifdef DOXYGEN_RUSSIAN
238 memset(a, 0, n*m*
sizeof(
double));
239 for(p = 0; p < m; p++)
249 #ifdef DOXYGEN_ENGLISH
274 #ifdef DOXYGEN_RUSSIAN
310 for(p = 0; p < m; p++)
325 #ifdef DOXYGEN_ENGLISH
405 #ifdef DOXYGEN_RUSSIAN
487 double* b,
int nb,
int mb,
496 if(na < 1 || ma < 1 || nb < 1 || mb < 1 || ma != nb)
500 dgemm_(
"N",
"N", &na, &mb, &ma, &alpha, a, &na, b, &nb, &beta, c, &na);
508 #ifdef DOXYGEN_ENGLISH
511 #ifdef DOXYGEN_RUSSIAN
514 int DSPL_API matrix_pinv(
double* a,
int n,
int m,
double* tol,
515 double* inv,
int* info)
528 mn = (m > n) ? n : m;
530 u = (
double*) malloc(n*n*
sizeof(
double));
537 vt = (
double*) malloc(m*m*
sizeof(
double));
544 s = (
double*) malloc(mn*
sizeof(
double));
551 err = matrix_svd(a, n, m, u, s, vt, info);
562 double mx = (n > m) ? (
double)n : (double)m;
563 err = minmax(s, mn, NULL, &smax);
564 eps = DBL_EPSILON * mx * smax;
567 for(i = 0; i < mn; i++)
573 v = (
double*) malloc(m*m*
sizeof(
double));
579 err = matrix_transpose(vt, m, m, v);
583 ut = (
double*) malloc(n*n*
sizeof(
double));
589 err = matrix_transpose(u, n, n, ut);
593 for(i = 0; i < mn; i++)
594 for(j = 0; j < m; j++)
598 memset(v+ mn*m, 0, (m-mn)*
sizeof(
double));
624 #ifdef DOXYGEN_ENGLISH
627 #ifdef DOXYGEN_RUSSIAN
630 int DSPL_API matrix_print(
double* a,
int n,
int m,
631 const char* name,
const char* format)
640 printf(
"\n%s = [ %% size [%d x %d] type: real", name, n, m);
642 for(p = 0; p < n; p++)
645 for(q = 0; q < m; q++)
647 printf(format, a[q*n + p]);
660 #ifdef DOXYGEN_ENGLISH
663 #ifdef DOXYGEN_RUSSIAN
666 int DSPL_API matrix_print_cmplx(
complex_t* a,
int n,
int m,
667 const char* name,
const char* format)
681 printf(
"\n%s = [ %% size [%d x %d] type: complex", name, n, m);
683 for(p = 0; p < n; p++)
686 for(q = 0; q < m; q++)
688 printf(format,
RE(a[q*n + p]),
IM(a[q*n + p]));
702 #ifdef DOXYGEN_ENGLISH
705 #ifdef DOXYGEN_RUSSIAN
708 int DSPL_API matrix_svd(
double* a,
int n,
int m,
709 double* u,
double* s,
double* vt,
int* info)
714 int lwork, mn, mx, err;
717 if(!a || !u || !s || !vt)
735 lwork = 4 * mn * mn + 6 * mn + mx;
736 work = (
double*) malloc(lwork*
sizeof(
double));
737 iwork = (
int*) malloc(8*mn*
sizeof(
int));
738 dgesdd_(&jobz, &n, &m, a, &n, s, u, &n, vt, &m, work, &lwork, iwork, &pi);
753 #ifdef DOXYGEN_ENGLISH
756 #ifdef DOXYGEN_RUSSIAN
759 int DSPL_API matrix_transpose(
double* a,
int n,
int m,
double* b)
761 int p, q, i, j, aind, bind;
768 for(p = 0; p < n - DSPL_MATRIX_BLOCK; p+=DSPL_MATRIX_BLOCK)
770 for(q = 0; q < m - DSPL_MATRIX_BLOCK; q+=DSPL_MATRIX_BLOCK)
772 for(i = 0; i < DSPL_MATRIX_BLOCK; i++)
774 for(j = 0; j < DSPL_MATRIX_BLOCK; j++)
776 aind = (q+j) * n + p + i;
777 bind = (p+i) * m + q + j;
783 for(i = p; i < n; i++)
784 for(j = 0; j < m; j++)
785 b[i*m + j] = a[j*n+i];
787 for(i = 0; i < p; i++)
788 for(j = q; j < m; j++)
789 b[i*m + j] = a[j*n+i];
798 #ifdef DOXYGEN_ENGLISH
801 #ifdef DOXYGEN_RUSSIAN
806 int p, q, i, j, aind, bind;
813 for(p = 0; p < n - DSPL_MATRIX_BLOCK; p+=DSPL_MATRIX_BLOCK)
815 for(q = 0; q < m - DSPL_MATRIX_BLOCK; q+=DSPL_MATRIX_BLOCK)
817 for(i = 0; i < DSPL_MATRIX_BLOCK; i++)
819 for(j = 0; j < DSPL_MATRIX_BLOCK; j++)
821 aind = (q+j) * n + p + i;
822 bind = (p+i) * m + q + j;
823 RE(b[bind]) =
RE(a[aind]);
824 IM(b[bind]) =
IM(a[aind]);
829 for(i = p; i < n; i++)
831 for(j = 0; j < m; j++)
833 RE(b[i*m + j]) =
RE(a[j*n+i]);
834 IM(b[i*m + j]) =
IM(a[j*n+i]);
838 for(i = 0; i < p; i++)
840 for(j = q; j < m; j++)
842 RE(b[i*m + j]) =
RE(a[j*n+i]);
843 IM(b[i*m + j]) =
IM(a[j*n+i]);
853 #ifdef DOXYGEN_ENGLISH
856 #ifdef DOXYGEN_RUSSIAN
861 int p, q, i, j, aind, bind;
868 for(p = 0; p < n - DSPL_MATRIX_BLOCK; p+=DSPL_MATRIX_BLOCK)
870 for(q = 0; q < m - DSPL_MATRIX_BLOCK; q+=DSPL_MATRIX_BLOCK)
872 for(i = 0; i < DSPL_MATRIX_BLOCK; i++)
874 for(j = 0; j < DSPL_MATRIX_BLOCK; j++)
876 aind = (q+j) * n + p + i;
877 bind = (p+i) * m + q + j;
878 RE(b[bind]) =
RE(a[aind]);
879 IM(b[bind]) = -
IM(a[aind]);
884 for(i = p; i < n; i++)
886 for(j = 0; j < m; j++)
888 RE(b[i*m + j]) =
RE(a[j*n+i]);
889 IM(b[i*m + j]) = -
IM(a[j*n+i]);
893 for(i = 0; i < p; i++)
895 for(j = q; j < m; j++)
897 RE(b[i*m + j]) =
RE(a[j*n+i]);
898 IM(b[i*m + j]) = -
IM(a[j*n+i]);
908 #ifdef DOXYGEN_ENGLISH
911 #ifdef DOXYGEN_RUSSIAN
914 int DSPL_API vector_dot(
double* x,
double* y,
int n,
double* p)
923 *p = ddot_(&n, x, &inc, y, &inc);