3 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Gerard Jungman & Brian
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or (at
9 * your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 /* GSL implementation of BLAS operations for vectors and dense
22 * matrices. Note that GSL native storage is row-major. */
25 #include <gsl/gsl_math.h>
26 #include <gsl/gsl_errno.h>
27 #include <gsl/gsl_cblas.h>
28 #include <gsl/gsl_cblas.h>
29 #include <gsl/gsl_blas_types.h>
30 #include <gsl/gsl_blas.h>
32 /* ========================================================================
34 * ========================================================================
37 /* CBLAS defines vector sizes in terms of int. GSL defines sizes in
38 terms of size_t, so we need to convert these into integers. There
39 is the possibility of overflow here. FIXME: Maybe this could be
42 #define INT(X) ((int)(X))
45 gsl_blas_sdsdot (float alpha, const gsl_vector_float * X,
46 const gsl_vector_float * Y, float *result)
48 if (X->size == Y->size)
51 cblas_sdsdot (INT (X->size), alpha, X->data, INT (X->stride), Y->data,
57 GSL_ERROR ("invalid length", GSL_EBADLEN);
62 gsl_blas_dsdot (const gsl_vector_float * X, const gsl_vector_float * Y,
65 if (X->size == Y->size)
68 cblas_dsdot (INT (X->size), X->data, INT (X->stride), Y->data,
74 GSL_ERROR ("invalid length", GSL_EBADLEN);
79 gsl_blas_sdot (const gsl_vector_float * X, const gsl_vector_float * Y,
82 if (X->size == Y->size)
85 cblas_sdot (INT (X->size), X->data, INT (X->stride), Y->data,
91 GSL_ERROR ("invalid length", GSL_EBADLEN);
96 gsl_blas_ddot (const gsl_vector * X, const gsl_vector * Y, double *result)
98 if (X->size == Y->size)
101 cblas_ddot (INT (X->size), X->data, INT (X->stride), Y->data,
107 GSL_ERROR ("invalid length", GSL_EBADLEN);
113 gsl_blas_cdotu (const gsl_vector_complex_float * X,
114 const gsl_vector_complex_float * Y, gsl_complex_float * dotu)
116 if (X->size == Y->size)
118 cblas_cdotu_sub (INT (X->size), X->data, INT (X->stride), Y->data,
119 INT (Y->stride), GSL_COMPLEX_P (dotu));
124 GSL_ERROR ("invalid length", GSL_EBADLEN);
130 gsl_blas_cdotc (const gsl_vector_complex_float * X,
131 const gsl_vector_complex_float * Y, gsl_complex_float * dotc)
133 if (X->size == Y->size)
135 cblas_cdotc_sub (INT (X->size), X->data, INT (X->stride), Y->data,
136 INT (Y->stride), GSL_COMPLEX_P (dotc));
141 GSL_ERROR ("invalid length", GSL_EBADLEN);
147 gsl_blas_zdotu (const gsl_vector_complex * X, const gsl_vector_complex * Y,
150 if (X->size == Y->size)
152 cblas_zdotu_sub (INT (X->size), X->data, INT (X->stride), Y->data,
153 INT (Y->stride), GSL_COMPLEX_P (dotu));
158 GSL_ERROR ("invalid length", GSL_EBADLEN);
164 gsl_blas_zdotc (const gsl_vector_complex * X, const gsl_vector_complex * Y,
167 if (X->size == Y->size)
169 cblas_zdotc_sub (INT (X->size), X->data, INT (X->stride), Y->data,
170 INT (Y->stride), GSL_COMPLEX_P (dotc));
175 GSL_ERROR ("invalid length", GSL_EBADLEN);
179 /* Norms of vectors */
182 gsl_blas_snrm2 (const gsl_vector_float * X)
184 return cblas_snrm2 (INT (X->size), X->data, INT (X->stride));
188 gsl_blas_dnrm2 (const gsl_vector * X)
190 return cblas_dnrm2 (INT (X->size), X->data, INT (X->stride));
194 gsl_blas_scnrm2 (const gsl_vector_complex_float * X)
196 return cblas_scnrm2 (INT (X->size), X->data, INT (X->stride));
200 gsl_blas_dznrm2 (const gsl_vector_complex * X)
202 return cblas_dznrm2 (INT (X->size), X->data, INT (X->stride));
205 /* Absolute sums of vectors */
208 gsl_blas_sasum (const gsl_vector_float * X)
210 return cblas_sasum (INT (X->size), X->data, INT (X->stride));
214 gsl_blas_dasum (const gsl_vector * X)
216 return cblas_dasum (INT (X->size), X->data, INT (X->stride));
220 gsl_blas_scasum (const gsl_vector_complex_float * X)
222 return cblas_scasum (INT (X->size), X->data, INT (X->stride));
226 gsl_blas_dzasum (const gsl_vector_complex * X)
228 return cblas_dzasum (INT (X->size), X->data, INT (X->stride));
231 /* Maximum elements of vectors */
234 gsl_blas_isamax (const gsl_vector_float * X)
236 return cblas_isamax (INT (X->size), X->data, INT (X->stride));
240 gsl_blas_idamax (const gsl_vector * X)
242 return cblas_idamax (INT (X->size), X->data, INT (X->stride));
246 gsl_blas_icamax (const gsl_vector_complex_float * X)
248 return cblas_icamax (INT (X->size), X->data, INT (X->stride));
252 gsl_blas_izamax (const gsl_vector_complex * X)
254 return cblas_izamax (INT (X->size), X->data, INT (X->stride));
261 gsl_blas_sswap (gsl_vector_float * X, gsl_vector_float * Y)
263 if (X->size == Y->size)
265 cblas_sswap (INT (X->size), X->data, INT (X->stride), Y->data,
271 GSL_ERROR ("invalid length", GSL_EBADLEN);
276 gsl_blas_dswap (gsl_vector * X, gsl_vector * Y)
278 if (X->size == Y->size)
280 cblas_dswap (INT (X->size), X->data, INT (X->stride), Y->data,
286 GSL_ERROR ("invalid length", GSL_EBADLEN);
291 gsl_blas_cswap (gsl_vector_complex_float * X, gsl_vector_complex_float * Y)
293 if (X->size == Y->size)
295 cblas_cswap (INT (X->size), X->data, INT (X->stride), Y->data,
301 GSL_ERROR ("invalid length", GSL_EBADLEN);
306 gsl_blas_zswap (gsl_vector_complex * X, gsl_vector_complex * Y)
308 if (X->size == Y->size)
310 cblas_zswap (INT (X->size), X->data, INT (X->stride), Y->data,
316 GSL_ERROR ("invalid length", GSL_EBADLEN);
324 gsl_blas_scopy (const gsl_vector_float * X, gsl_vector_float * Y)
326 if (X->size == Y->size)
328 cblas_scopy (INT (X->size), X->data, INT (X->stride), Y->data,
334 GSL_ERROR ("invalid length", GSL_EBADLEN);
339 gsl_blas_dcopy (const gsl_vector * X, gsl_vector * Y)
341 if (X->size == Y->size)
343 cblas_dcopy (INT (X->size), X->data, INT (X->stride), Y->data,
349 GSL_ERROR ("invalid length", GSL_EBADLEN);
354 gsl_blas_ccopy (const gsl_vector_complex_float * X,
355 gsl_vector_complex_float * Y)
357 if (X->size == Y->size)
359 cblas_ccopy (INT (X->size), X->data, INT (X->stride), Y->data,
365 GSL_ERROR ("invalid length", GSL_EBADLEN);
370 gsl_blas_zcopy (const gsl_vector_complex * X, gsl_vector_complex * Y)
372 if (X->size == Y->size)
374 cblas_zcopy (INT (X->size), X->data, INT (X->stride), Y->data,
380 GSL_ERROR ("invalid length", GSL_EBADLEN);
385 /* Compute Y = alpha X + Y */
388 gsl_blas_saxpy (float alpha, const gsl_vector_float * X, gsl_vector_float * Y)
390 if (X->size == Y->size)
392 cblas_saxpy (INT (X->size), alpha, X->data, INT (X->stride), Y->data,
398 GSL_ERROR ("invalid length", GSL_EBADLEN);
403 gsl_blas_daxpy (double alpha, const gsl_vector * X, gsl_vector * Y)
405 if (X->size == Y->size)
407 cblas_daxpy (INT (X->size), alpha, X->data, INT (X->stride), Y->data,
413 GSL_ERROR ("invalid length", GSL_EBADLEN);
418 gsl_blas_caxpy (const gsl_complex_float alpha,
419 const gsl_vector_complex_float * X,
420 gsl_vector_complex_float * Y)
422 if (X->size == Y->size)
424 cblas_caxpy (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
425 INT (X->stride), Y->data, INT (Y->stride));
430 GSL_ERROR ("invalid length", GSL_EBADLEN);
435 gsl_blas_zaxpy (const gsl_complex alpha, const gsl_vector_complex * X,
436 gsl_vector_complex * Y)
438 if (X->size == Y->size)
440 cblas_zaxpy (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
441 INT (X->stride), Y->data, INT (Y->stride));
446 GSL_ERROR ("invalid length", GSL_EBADLEN);
450 /* Generate rotation */
453 gsl_blas_srotg (float a[], float b[], float c[], float s[])
455 cblas_srotg (a, b, c, s);
460 gsl_blas_drotg (double a[], double b[], double c[], double s[])
462 cblas_drotg (a, b, c, s);
466 /* Apply rotation to vectors */
469 gsl_blas_srot (gsl_vector_float * X, gsl_vector_float * Y, float c, float s)
471 if (X->size == Y->size)
473 cblas_srot (INT (X->size), X->data, INT (X->stride), Y->data,
474 INT (Y->stride), c, s);
479 GSL_ERROR ("invalid length", GSL_EBADLEN);
484 gsl_blas_drot (gsl_vector * X, gsl_vector * Y, const double c, const double s)
486 if (X->size == Y->size)
488 cblas_drot (INT (X->size), X->data, INT (X->stride), Y->data,
489 INT (Y->stride), c, s);
494 GSL_ERROR ("invalid length", GSL_EBADLEN);
499 /* Generate modified rotation */
502 gsl_blas_srotmg (float d1[], float d2[], float b1[], float b2, float P[])
504 cblas_srotmg (d1, d2, b1, b2, P);
509 gsl_blas_drotmg (double d1[], double d2[], double b1[], double b2, double P[])
511 cblas_drotmg (d1, d2, b1, b2, P);
516 /* Apply modified rotation */
519 gsl_blas_srotm (gsl_vector_float * X, gsl_vector_float * Y, const float P[])
521 if (X->size == Y->size)
523 cblas_srotm (INT (X->size), X->data, INT (X->stride), Y->data,
529 GSL_ERROR ("invalid length", GSL_EBADLEN);
534 gsl_blas_drotm (gsl_vector * X, gsl_vector * Y, const double P[])
536 if (X->size != Y->size)
538 cblas_drotm (INT (X->size), X->data, INT (X->stride), Y->data,
544 GSL_ERROR ("invalid length", GSL_EBADLEN);
552 gsl_blas_sscal (float alpha, gsl_vector_float * X)
554 cblas_sscal (INT (X->size), alpha, X->data, INT (X->stride));
558 gsl_blas_dscal (double alpha, gsl_vector * X)
560 cblas_dscal (INT (X->size), alpha, X->data, INT (X->stride));
564 gsl_blas_cscal (const gsl_complex_float alpha, gsl_vector_complex_float * X)
566 cblas_cscal (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
571 gsl_blas_zscal (const gsl_complex alpha, gsl_vector_complex * X)
573 cblas_zscal (INT (X->size), GSL_COMPLEX_P (&alpha), X->data,
578 gsl_blas_csscal (float alpha, gsl_vector_complex_float * X)
580 cblas_csscal (INT (X->size), alpha, X->data, INT (X->stride));
584 gsl_blas_zdscal (double alpha, gsl_vector_complex * X)
586 cblas_zdscal (INT (X->size), alpha, X->data, INT (X->stride));
589 /* ===========================================================================
591 * ===========================================================================
597 gsl_blas_sgemv (CBLAS_TRANSPOSE_t TransA, float alpha,
598 const gsl_matrix_float * A, const gsl_vector_float * X,
599 float beta, gsl_vector_float * Y)
601 const size_t M = A->size1;
602 const size_t N = A->size2;
604 if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
605 || (TransA == CblasTrans && M == X->size && N == Y->size))
607 cblas_sgemv (CblasRowMajor, TransA, INT (M), INT (N), alpha, A->data,
608 INT (A->tda), X->data, INT (X->stride), beta, Y->data,
614 GSL_ERROR ("invalid length", GSL_EBADLEN);
620 gsl_blas_dgemv (CBLAS_TRANSPOSE_t TransA, double alpha, const gsl_matrix * A,
621 const gsl_vector * X, double beta, gsl_vector * Y)
623 const size_t M = A->size1;
624 const size_t N = A->size2;
626 if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
627 || (TransA == CblasTrans && M == X->size && N == Y->size))
629 cblas_dgemv (CblasRowMajor, TransA, INT (M), INT (N), alpha, A->data,
630 INT (A->tda), X->data, INT (X->stride), beta, Y->data,
636 GSL_ERROR ("invalid length", GSL_EBADLEN);
642 gsl_blas_cgemv (CBLAS_TRANSPOSE_t TransA, const gsl_complex_float alpha,
643 const gsl_matrix_complex_float * A,
644 const gsl_vector_complex_float * X,
645 const gsl_complex_float beta, gsl_vector_complex_float * Y)
647 const size_t M = A->size1;
648 const size_t N = A->size2;
650 if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
651 || (TransA == CblasTrans && M == X->size && N == Y->size)
652 || (TransA == CblasConjTrans && M == X->size && N == Y->size))
654 cblas_cgemv (CblasRowMajor, TransA, INT (M), INT (N),
655 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), X->data,
656 INT (X->stride), GSL_COMPLEX_P (&beta), Y->data,
662 GSL_ERROR ("invalid length", GSL_EBADLEN);
668 gsl_blas_zgemv (CBLAS_TRANSPOSE_t TransA, const gsl_complex alpha,
669 const gsl_matrix_complex * A, const gsl_vector_complex * X,
670 const gsl_complex beta, gsl_vector_complex * Y)
672 const size_t M = A->size1;
673 const size_t N = A->size2;
675 if ((TransA == CblasNoTrans && N == X->size && M == Y->size)
676 || (TransA == CblasTrans && M == X->size && N == Y->size)
677 || (TransA == CblasConjTrans && M == X->size && N == Y->size))
679 cblas_zgemv (CblasRowMajor, TransA, INT (M), INT (N),
680 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), X->data,
681 INT (X->stride), GSL_COMPLEX_P (&beta), Y->data,
687 GSL_ERROR ("invalid length", GSL_EBADLEN);
696 gsl_blas_chemv (CBLAS_UPLO_t Uplo, const gsl_complex_float alpha,
697 const gsl_matrix_complex_float * A,
698 const gsl_vector_complex_float * X,
699 const gsl_complex_float beta, gsl_vector_complex_float * Y)
701 const size_t M = A->size1;
702 const size_t N = A->size2;
706 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
708 else if (N != X->size || N != Y->size)
710 GSL_ERROR ("invalid length", GSL_EBADLEN);
713 cblas_chemv (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), A->data,
714 INT (A->tda), X->data, INT (X->stride), GSL_COMPLEX_P (&beta),
715 Y->data, INT (Y->stride));
720 gsl_blas_zhemv (CBLAS_UPLO_t Uplo, const gsl_complex alpha,
721 const gsl_matrix_complex * A, const gsl_vector_complex * X,
722 const gsl_complex beta, gsl_vector_complex * Y)
724 const size_t M = A->size1;
725 const size_t N = A->size2;
729 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
731 else if (N != X->size || N != Y->size)
733 GSL_ERROR ("invalid length", GSL_EBADLEN);
736 cblas_zhemv (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), A->data,
737 INT (A->tda), X->data, INT (X->stride), GSL_COMPLEX_P (&beta),
738 Y->data, INT (Y->stride));
746 gsl_blas_ssymv (CBLAS_UPLO_t Uplo, float alpha, const gsl_matrix_float * A,
747 const gsl_vector_float * X, float beta, gsl_vector_float * Y)
749 const size_t M = A->size1;
750 const size_t N = A->size2;
754 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
756 else if (N != X->size || N != Y->size)
758 GSL_ERROR ("invalid length", GSL_EBADLEN);
761 cblas_ssymv (CblasRowMajor, Uplo, INT (N), alpha, A->data, INT (A->tda),
762 X->data, INT (X->stride), beta, Y->data, INT (Y->stride));
767 gsl_blas_dsymv (CBLAS_UPLO_t Uplo, double alpha, const gsl_matrix * A,
768 const gsl_vector * X, double beta, gsl_vector * Y)
770 const size_t M = A->size1;
771 const size_t N = A->size2;
775 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
777 else if (N != X->size || N != Y->size)
779 GSL_ERROR ("invalid length", GSL_EBADLEN);
782 cblas_dsymv (CblasRowMajor, Uplo, INT (N), alpha, A->data, INT (A->tda),
783 X->data, INT (X->stride), beta, Y->data, INT (Y->stride));
791 gsl_blas_strmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
792 CBLAS_DIAG_t Diag, const gsl_matrix_float * A,
793 gsl_vector_float * X)
795 const size_t M = A->size1;
796 const size_t N = A->size2;
800 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
802 else if (N != X->size)
804 GSL_ERROR ("invalid length", GSL_EBADLEN);
807 cblas_strmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
808 INT (A->tda), X->data, INT (X->stride));
814 gsl_blas_dtrmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
815 CBLAS_DIAG_t Diag, const gsl_matrix * A, gsl_vector * X)
817 const size_t M = A->size1;
818 const size_t N = A->size2;
822 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
824 else if (N != X->size)
826 GSL_ERROR ("invalid length", GSL_EBADLEN);
829 cblas_dtrmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
830 INT (A->tda), X->data, INT (X->stride));
836 gsl_blas_ctrmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
837 CBLAS_DIAG_t Diag, const gsl_matrix_complex_float * A,
838 gsl_vector_complex_float * X)
840 const size_t M = A->size1;
841 const size_t N = A->size2;
845 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
847 else if (N != X->size)
849 GSL_ERROR ("invalid length", GSL_EBADLEN);
852 cblas_ctrmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
853 INT (A->tda), X->data, INT (X->stride));
859 gsl_blas_ztrmv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
860 CBLAS_DIAG_t Diag, const gsl_matrix_complex * A,
861 gsl_vector_complex * X)
863 const size_t M = A->size1;
864 const size_t N = A->size2;
868 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
870 else if (N != X->size)
872 GSL_ERROR ("invalid length", GSL_EBADLEN);
875 cblas_ztrmv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
876 INT (A->tda), X->data, INT (X->stride));
884 gsl_blas_strsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
885 CBLAS_DIAG_t Diag, const gsl_matrix_float * A,
886 gsl_vector_float * X)
888 const size_t M = A->size1;
889 const size_t N = A->size2;
893 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
895 else if (N != X->size)
897 GSL_ERROR ("invalid length", GSL_EBADLEN);
900 cblas_strsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
901 INT (A->tda), X->data, INT (X->stride));
907 gsl_blas_dtrsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
908 CBLAS_DIAG_t Diag, const gsl_matrix * A, gsl_vector * X)
910 const size_t M = A->size1;
911 const size_t N = A->size2;
915 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
917 else if (N != X->size)
919 GSL_ERROR ("invalid length", GSL_EBADLEN);
922 cblas_dtrsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
923 INT (A->tda), X->data, INT (X->stride));
929 gsl_blas_ctrsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
930 CBLAS_DIAG_t Diag, const gsl_matrix_complex_float * A,
931 gsl_vector_complex_float * X)
933 const size_t M = A->size1;
934 const size_t N = A->size2;
938 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
940 else if (N != X->size)
942 GSL_ERROR ("invalid length", GSL_EBADLEN);
945 cblas_ctrsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
946 INT (A->tda), X->data, INT (X->stride));
952 gsl_blas_ztrsv (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA,
953 CBLAS_DIAG_t Diag, const gsl_matrix_complex * A,
954 gsl_vector_complex * X)
956 const size_t M = A->size1;
957 const size_t N = A->size2;
961 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
963 else if (N != X->size)
965 GSL_ERROR ("invalid length", GSL_EBADLEN);
968 cblas_ztrsv (CblasRowMajor, Uplo, TransA, Diag, INT (N), A->data,
969 INT (A->tda), X->data, INT (X->stride));
977 gsl_blas_sger (float alpha, const gsl_vector_float * X,
978 const gsl_vector_float * Y, gsl_matrix_float * A)
980 const size_t M = A->size1;
981 const size_t N = A->size2;
983 if (X->size == M && Y->size == N)
985 cblas_sger (CblasRowMajor, INT (M), INT (N), alpha, X->data,
986 INT (X->stride), Y->data, INT (Y->stride), A->data,
992 GSL_ERROR ("invalid length", GSL_EBADLEN);
998 gsl_blas_dger (double alpha, const gsl_vector * X, const gsl_vector * Y,
1001 const size_t M = A->size1;
1002 const size_t N = A->size2;
1004 if (X->size == M && Y->size == N)
1006 cblas_dger (CblasRowMajor, INT (M), INT (N), alpha, X->data,
1007 INT (X->stride), Y->data, INT (Y->stride), A->data,
1013 GSL_ERROR ("invalid length", GSL_EBADLEN);
1021 gsl_blas_cgeru (const gsl_complex_float alpha,
1022 const gsl_vector_complex_float * X,
1023 const gsl_vector_complex_float * Y,
1024 gsl_matrix_complex_float * A)
1026 const size_t M = A->size1;
1027 const size_t N = A->size2;
1029 if (X->size == M && Y->size == N)
1031 cblas_cgeru (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
1032 X->data, INT (X->stride), Y->data, INT (Y->stride),
1033 A->data, INT (A->tda));
1038 GSL_ERROR ("invalid length", GSL_EBADLEN);
1043 gsl_blas_zgeru (const gsl_complex alpha, const gsl_vector_complex * X,
1044 const gsl_vector_complex * Y, gsl_matrix_complex * A)
1046 const size_t M = A->size1;
1047 const size_t N = A->size2;
1049 if (X->size == M && Y->size == N)
1051 cblas_zgeru (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
1052 X->data, INT (X->stride), Y->data, INT (Y->stride),
1053 A->data, INT (A->tda));
1058 GSL_ERROR ("invalid length", GSL_EBADLEN);
1066 gsl_blas_cgerc (const gsl_complex_float alpha,
1067 const gsl_vector_complex_float * X,
1068 const gsl_vector_complex_float * Y,
1069 gsl_matrix_complex_float * A)
1071 const size_t M = A->size1;
1072 const size_t N = A->size2;
1074 if (X->size == M && Y->size == N)
1076 cblas_cgerc (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
1077 X->data, INT (X->stride), Y->data, INT (Y->stride),
1078 A->data, INT (A->tda));
1083 GSL_ERROR ("invalid length", GSL_EBADLEN);
1089 gsl_blas_zgerc (const gsl_complex alpha, const gsl_vector_complex * X,
1090 const gsl_vector_complex * Y, gsl_matrix_complex * A)
1092 const size_t M = A->size1;
1093 const size_t N = A->size2;
1095 if (X->size == M && Y->size == N)
1097 cblas_zgerc (CblasRowMajor, INT (M), INT (N), GSL_COMPLEX_P (&alpha),
1098 X->data, INT (X->stride), Y->data, INT (Y->stride),
1099 A->data, INT (A->tda));
1104 GSL_ERROR ("invalid length", GSL_EBADLEN);
1111 gsl_blas_cher (CBLAS_UPLO_t Uplo, float alpha,
1112 const gsl_vector_complex_float * X,
1113 gsl_matrix_complex_float * A)
1115 const size_t M = A->size1;
1116 const size_t N = A->size2;
1120 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
1122 else if (X->size != N)
1124 GSL_ERROR ("invalid length", GSL_EBADLEN);
1127 cblas_cher (CblasRowMajor, Uplo, INT (M), alpha, X->data, INT (X->stride),
1128 A->data, INT (A->tda));
1134 gsl_blas_zher (CBLAS_UPLO_t Uplo, double alpha, const gsl_vector_complex * X,
1135 gsl_matrix_complex * A)
1137 const size_t M = A->size1;
1138 const size_t N = A->size2;
1142 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
1144 else if (X->size != N)
1146 GSL_ERROR ("invalid length", GSL_EBADLEN);
1149 cblas_zher (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
1150 A->data, INT (A->tda));
1158 gsl_blas_cher2 (CBLAS_UPLO_t Uplo, const gsl_complex_float alpha,
1159 const gsl_vector_complex_float * X,
1160 const gsl_vector_complex_float * Y,
1161 gsl_matrix_complex_float * A)
1163 const size_t M = A->size1;
1164 const size_t N = A->size2;
1168 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
1170 else if (X->size != N || Y->size != N)
1172 GSL_ERROR ("invalid length", GSL_EBADLEN);
1175 cblas_cher2 (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), X->data,
1176 INT (X->stride), Y->data, INT (Y->stride), A->data,
1183 gsl_blas_zher2 (CBLAS_UPLO_t Uplo, const gsl_complex alpha,
1184 const gsl_vector_complex * X, const gsl_vector_complex * Y,
1185 gsl_matrix_complex * A)
1187 const size_t M = A->size1;
1188 const size_t N = A->size2;
1192 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
1194 else if (X->size != N || Y->size != N)
1196 GSL_ERROR ("invalid length", GSL_EBADLEN);
1199 cblas_zher2 (CblasRowMajor, Uplo, INT (N), GSL_COMPLEX_P (&alpha), X->data,
1200 INT (X->stride), Y->data, INT (Y->stride), A->data,
1209 gsl_blas_ssyr (CBLAS_UPLO_t Uplo, float alpha, const gsl_vector_float * X,
1210 gsl_matrix_float * A)
1212 const size_t M = A->size1;
1213 const size_t N = A->size2;
1217 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
1219 else if (X->size != N)
1221 GSL_ERROR ("invalid length", GSL_EBADLEN);
1224 cblas_ssyr (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
1225 A->data, INT (A->tda));
1231 gsl_blas_dsyr (CBLAS_UPLO_t Uplo, double alpha, const gsl_vector * X,
1234 const size_t M = A->size1;
1235 const size_t N = A->size2;
1239 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
1241 else if (X->size != N)
1243 GSL_ERROR ("invalid length", GSL_EBADLEN);
1246 cblas_dsyr (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
1247 A->data, INT (A->tda));
1255 gsl_blas_ssyr2 (CBLAS_UPLO_t Uplo, float alpha, const gsl_vector_float * X,
1256 const gsl_vector_float * Y, gsl_matrix_float * A)
1258 const size_t M = A->size1;
1259 const size_t N = A->size2;
1263 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
1265 else if (X->size != N || Y->size != N)
1267 GSL_ERROR ("invalid length", GSL_EBADLEN);
1270 cblas_ssyr2 (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
1271 Y->data, INT (Y->stride), A->data, INT (A->tda));
1277 gsl_blas_dsyr2 (CBLAS_UPLO_t Uplo, double alpha, const gsl_vector * X,
1278 const gsl_vector * Y, gsl_matrix * A)
1280 const size_t M = A->size1;
1281 const size_t N = A->size2;
1285 GSL_ERROR ("matrix must be square", GSL_ENOTSQR);
1287 else if (X->size != N || Y->size != N)
1289 GSL_ERROR ("invalid length", GSL_EBADLEN);
1292 cblas_dsyr2 (CblasRowMajor, Uplo, INT (N), alpha, X->data, INT (X->stride),
1293 Y->data, INT (Y->stride), A->data, INT (A->tda));
1299 * ===========================================================================
1300 * Prototypes for level 3 BLAS
1301 * ===========================================================================
1308 gsl_blas_sgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
1309 float alpha, const gsl_matrix_float * A,
1310 const gsl_matrix_float * B, float beta, gsl_matrix_float * C)
1312 const size_t M = C->size1;
1313 const size_t N = C->size2;
1314 const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
1315 const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
1316 const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
1317 const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
1319 if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
1321 cblas_sgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
1322 alpha, A->data, INT (A->tda), B->data, INT (B->tda), beta,
1323 C->data, INT (C->tda));
1328 GSL_ERROR ("invalid length", GSL_EBADLEN);
1334 gsl_blas_dgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
1335 double alpha, const gsl_matrix * A, const gsl_matrix * B,
1336 double beta, gsl_matrix * C)
1338 const size_t M = C->size1;
1339 const size_t N = C->size2;
1340 const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
1341 const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
1342 const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
1343 const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
1345 if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
1347 cblas_dgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
1348 alpha, A->data, INT (A->tda), B->data, INT (B->tda), beta,
1349 C->data, INT (C->tda));
1354 GSL_ERROR ("invalid length", GSL_EBADLEN);
1360 gsl_blas_cgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
1361 const gsl_complex_float alpha,
1362 const gsl_matrix_complex_float * A,
1363 const gsl_matrix_complex_float * B,
1364 const gsl_complex_float beta, gsl_matrix_complex_float * C)
1366 const size_t M = C->size1;
1367 const size_t N = C->size2;
1368 const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
1369 const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
1370 const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
1371 const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
1373 if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
1375 cblas_cgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
1376 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1377 INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
1383 GSL_ERROR ("invalid length", GSL_EBADLEN);
1389 gsl_blas_zgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB,
1390 const gsl_complex alpha, const gsl_matrix_complex * A,
1391 const gsl_matrix_complex * B, const gsl_complex beta,
1392 gsl_matrix_complex * C)
1394 const size_t M = C->size1;
1395 const size_t N = C->size2;
1396 const size_t MA = (TransA == CblasNoTrans) ? A->size1 : A->size2;
1397 const size_t NA = (TransA == CblasNoTrans) ? A->size2 : A->size1;
1398 const size_t MB = (TransB == CblasNoTrans) ? B->size1 : B->size2;
1399 const size_t NB = (TransB == CblasNoTrans) ? B->size2 : B->size1;
1401 if (M == MA && N == NB && NA == MB) /* [MxN] = [MAxNA][MBxNB] */
1403 cblas_zgemm (CblasRowMajor, TransA, TransB, INT (M), INT (N), INT (NA),
1404 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1405 INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
1411 GSL_ERROR ("invalid length", GSL_EBADLEN);
1419 gsl_blas_ssymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, float alpha,
1420 const gsl_matrix_float * A, const gsl_matrix_float * B,
1421 float beta, gsl_matrix_float * C)
1423 const size_t M = C->size1;
1424 const size_t N = C->size2;
1425 const size_t MA = A->size1;
1426 const size_t NA = A->size2;
1427 const size_t MB = B->size1;
1428 const size_t NB = B->size2;
1432 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
1435 if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
1436 || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
1438 cblas_ssymm (CblasRowMajor, Side, Uplo, INT (M), INT (N), alpha,
1439 A->data, INT (A->tda), B->data, INT (B->tda), beta,
1440 C->data, INT (C->tda));
1445 GSL_ERROR ("invalid length", GSL_EBADLEN);
1452 gsl_blas_dsymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, double alpha,
1453 const gsl_matrix * A, const gsl_matrix * B, double beta,
1456 const size_t M = C->size1;
1457 const size_t N = C->size2;
1458 const size_t MA = A->size1;
1459 const size_t NA = A->size2;
1460 const size_t MB = B->size1;
1461 const size_t NB = B->size2;
1465 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
1468 if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
1469 || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
1471 cblas_dsymm (CblasRowMajor, Side, Uplo, INT (M), INT (N), alpha,
1472 A->data, INT (A->tda), B->data, INT (B->tda), beta,
1473 C->data, INT (C->tda));
1478 GSL_ERROR ("invalid length", GSL_EBADLEN);
1484 gsl_blas_csymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
1485 const gsl_complex_float alpha,
1486 const gsl_matrix_complex_float * A,
1487 const gsl_matrix_complex_float * B,
1488 const gsl_complex_float beta, gsl_matrix_complex_float * C)
1490 const size_t M = C->size1;
1491 const size_t N = C->size2;
1492 const size_t MA = A->size1;
1493 const size_t NA = A->size2;
1494 const size_t MB = B->size1;
1495 const size_t NB = B->size2;
1499 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
1502 if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
1503 || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
1505 cblas_csymm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
1506 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1507 INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
1513 GSL_ERROR ("invalid length", GSL_EBADLEN);
1518 gsl_blas_zsymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
1519 const gsl_complex alpha, const gsl_matrix_complex * A,
1520 const gsl_matrix_complex * B, const gsl_complex beta,
1521 gsl_matrix_complex * C)
1523 const size_t M = C->size1;
1524 const size_t N = C->size2;
1525 const size_t MA = A->size1;
1526 const size_t NA = A->size2;
1527 const size_t MB = B->size1;
1528 const size_t NB = B->size2;
1532 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
1535 if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
1536 || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
1538 cblas_zsymm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
1539 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1540 INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
1546 GSL_ERROR ("invalid length", GSL_EBADLEN);
1554 gsl_blas_chemm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
1555 const gsl_complex_float alpha,
1556 const gsl_matrix_complex_float * A,
1557 const gsl_matrix_complex_float * B,
1558 const gsl_complex_float beta, gsl_matrix_complex_float * C)
1560 const size_t M = C->size1;
1561 const size_t N = C->size2;
1562 const size_t MA = A->size1;
1563 const size_t NA = A->size2;
1564 const size_t MB = B->size1;
1565 const size_t NB = B->size2;
1569 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
1572 if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
1573 || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
1575 cblas_chemm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
1576 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1577 INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
1583 GSL_ERROR ("invalid length", GSL_EBADLEN);
1590 gsl_blas_zhemm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
1591 const gsl_complex alpha, const gsl_matrix_complex * A,
1592 const gsl_matrix_complex * B, const gsl_complex beta,
1593 gsl_matrix_complex * C)
1595 const size_t M = C->size1;
1596 const size_t N = C->size2;
1597 const size_t MA = A->size1;
1598 const size_t NA = A->size2;
1599 const size_t MB = B->size1;
1600 const size_t NB = B->size2;
1604 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
1607 if ((Side == CblasLeft && (M == MA && N == NB && NA == MB))
1608 || (Side == CblasRight && (M == MB && N == NA && NB == MA)))
1610 cblas_zhemm (CblasRowMajor, Side, Uplo, INT (M), INT (N),
1611 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1612 INT (B->tda), GSL_COMPLEX_P (&beta), C->data,
1618 GSL_ERROR ("invalid length", GSL_EBADLEN);
1625 gsl_blas_ssyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha,
1626 const gsl_matrix_float * A, float beta, gsl_matrix_float * C)
1628 const size_t M = C->size1;
1629 const size_t N = C->size2;
1630 const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1631 const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1635 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1639 GSL_ERROR ("invalid length", GSL_EBADLEN);
1642 cblas_ssyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
1643 INT (A->tda), beta, C->data, INT (C->tda));
1649 gsl_blas_dsyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha,
1650 const gsl_matrix * A, double beta, gsl_matrix * C)
1652 const size_t M = C->size1;
1653 const size_t N = C->size2;
1654 const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1655 const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1659 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1663 GSL_ERROR ("invalid length", GSL_EBADLEN);
1666 cblas_dsyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
1667 INT (A->tda), beta, C->data, INT (C->tda));
1674 gsl_blas_csyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
1675 const gsl_complex_float alpha,
1676 const gsl_matrix_complex_float * A,
1677 const gsl_complex_float beta, gsl_matrix_complex_float * C)
1679 const size_t M = C->size1;
1680 const size_t N = C->size2;
1681 const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1682 const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1686 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1690 GSL_ERROR ("invalid length", GSL_EBADLEN);
1693 cblas_csyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K),
1694 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda),
1695 GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
1701 gsl_blas_zsyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
1702 const gsl_complex alpha, const gsl_matrix_complex * A,
1703 const gsl_complex beta, gsl_matrix_complex * C)
1705 const size_t M = C->size1;
1706 const size_t N = C->size2;
1707 const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1708 const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1712 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1716 GSL_ERROR ("invalid length", GSL_EBADLEN);
1719 cblas_zsyrk (CblasRowMajor, Uplo, Trans, INT (N), INT (K),
1720 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda),
1721 GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
1728 gsl_blas_cherk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha,
1729 const gsl_matrix_complex_float * A, float beta,
1730 gsl_matrix_complex_float * C)
1732 const size_t M = C->size1;
1733 const size_t N = C->size2;
1734 const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1735 const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1739 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1743 GSL_ERROR ("invalid length", GSL_EBADLEN);
1746 cblas_cherk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
1747 INT (A->tda), beta, C->data, INT (C->tda));
1753 gsl_blas_zherk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha,
1754 const gsl_matrix_complex * A, double beta,
1755 gsl_matrix_complex * C)
1757 const size_t M = C->size1;
1758 const size_t N = C->size2;
1759 const size_t J = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1760 const size_t K = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1764 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1768 GSL_ERROR ("invalid length", GSL_EBADLEN);
1771 cblas_zherk (CblasRowMajor, Uplo, Trans, INT (N), INT (K), alpha, A->data,
1772 INT (A->tda), beta, C->data, INT (C->tda));
1779 gsl_blas_ssyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha,
1780 const gsl_matrix_float * A, const gsl_matrix_float * B,
1781 float beta, gsl_matrix_float * C)
1783 const size_t M = C->size1;
1784 const size_t N = C->size2;
1785 const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1786 const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1787 const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
1788 const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
1792 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1794 else if (N != MA || N != MB || NA != NB)
1796 GSL_ERROR ("invalid length", GSL_EBADLEN);
1799 cblas_ssyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA), alpha, A->data,
1800 INT (A->tda), B->data, INT (B->tda), beta, C->data,
1807 gsl_blas_dsyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha,
1808 const gsl_matrix * A, const gsl_matrix * B, double beta,
1811 const size_t M = C->size1;
1812 const size_t N = C->size2;
1813 const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1814 const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1815 const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
1816 const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
1820 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1822 else if (N != MA || N != MB || NA != NB)
1824 GSL_ERROR ("invalid length", GSL_EBADLEN);
1827 cblas_dsyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA), alpha, A->data,
1828 INT (A->tda), B->data, INT (B->tda), beta, C->data,
1835 gsl_blas_csyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
1836 const gsl_complex_float alpha,
1837 const gsl_matrix_complex_float * A,
1838 const gsl_matrix_complex_float * B,
1839 const gsl_complex_float beta, gsl_matrix_complex_float * C)
1841 const size_t M = C->size1;
1842 const size_t N = C->size2;
1843 const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1844 const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1845 const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
1846 const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
1850 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1852 else if (N != MA || N != MB || NA != NB)
1854 GSL_ERROR ("invalid length", GSL_EBADLEN);
1857 cblas_csyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
1858 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1859 INT (B->tda), GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
1866 gsl_blas_zsyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
1867 const gsl_complex alpha, const gsl_matrix_complex * A,
1868 const gsl_matrix_complex * B, const gsl_complex beta,
1869 gsl_matrix_complex * C)
1871 const size_t M = C->size1;
1872 const size_t N = C->size2;
1873 const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1874 const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1875 const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
1876 const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
1880 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1882 else if (N != MA || N != MB || NA != NB)
1884 GSL_ERROR ("invalid length", GSL_EBADLEN);
1887 cblas_zsyr2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
1888 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1889 INT (B->tda), GSL_COMPLEX_P (&beta), C->data, INT (C->tda));
1896 gsl_blas_cher2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
1897 const gsl_complex_float alpha,
1898 const gsl_matrix_complex_float * A,
1899 const gsl_matrix_complex_float * B, float beta,
1900 gsl_matrix_complex_float * C)
1902 const size_t M = C->size1;
1903 const size_t N = C->size2;
1904 const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1905 const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1906 const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
1907 const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
1911 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1913 else if (N != MA || N != MB || NA != NB)
1915 GSL_ERROR ("invalid length", GSL_EBADLEN);
1918 cblas_cher2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
1919 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1920 INT (B->tda), beta, C->data, INT (C->tda));
1927 gsl_blas_zher2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans,
1928 const gsl_complex alpha, const gsl_matrix_complex * A,
1929 const gsl_matrix_complex * B, double beta,
1930 gsl_matrix_complex * C)
1932 const size_t M = C->size1;
1933 const size_t N = C->size2;
1934 const size_t MA = (Trans == CblasNoTrans) ? A->size1 : A->size2;
1935 const size_t NA = (Trans == CblasNoTrans) ? A->size2 : A->size1;
1936 const size_t MB = (Trans == CblasNoTrans) ? B->size1 : B->size2;
1937 const size_t NB = (Trans == CblasNoTrans) ? B->size2 : B->size1;
1941 GSL_ERROR ("matrix C must be square", GSL_ENOTSQR);
1943 else if (N != MA || N != MB || NA != NB)
1945 GSL_ERROR ("invalid length", GSL_EBADLEN);
1948 cblas_zher2k (CblasRowMajor, Uplo, Trans, INT (N), INT (NA),
1949 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
1950 INT (B->tda), beta, C->data, INT (C->tda));
1958 gsl_blas_strmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
1959 CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, float alpha,
1960 const gsl_matrix_float * A, gsl_matrix_float * B)
1962 const size_t M = B->size1;
1963 const size_t N = B->size2;
1964 const size_t MA = A->size1;
1965 const size_t NA = A->size2;
1969 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
1972 if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
1974 cblas_strmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
1975 alpha, A->data, INT (A->tda), B->data, INT (B->tda));
1980 GSL_ERROR ("invalid length", GSL_EBADLEN);
1986 gsl_blas_dtrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
1987 CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, double alpha,
1988 const gsl_matrix * A, gsl_matrix * B)
1990 const size_t M = B->size1;
1991 const size_t N = B->size2;
1992 const size_t MA = A->size1;
1993 const size_t NA = A->size2;
1997 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
2000 if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
2002 cblas_dtrmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
2003 alpha, A->data, INT (A->tda), B->data, INT (B->tda));
2008 GSL_ERROR ("invalid length", GSL_EBADLEN);
2014 gsl_blas_ctrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
2015 CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
2016 const gsl_complex_float alpha,
2017 const gsl_matrix_complex_float * A,
2018 gsl_matrix_complex_float * B)
2020 const size_t M = B->size1;
2021 const size_t N = B->size2;
2022 const size_t MA = A->size1;
2023 const size_t NA = A->size2;
2027 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
2030 if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
2032 cblas_ctrmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
2033 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
2039 GSL_ERROR ("invalid length", GSL_EBADLEN);
2045 gsl_blas_ztrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
2046 CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
2047 const gsl_complex alpha, const gsl_matrix_complex * A,
2048 gsl_matrix_complex * B)
2050 const size_t M = B->size1;
2051 const size_t N = B->size2;
2052 const size_t MA = A->size1;
2053 const size_t NA = A->size2;
2057 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
2060 if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
2062 cblas_ztrmm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
2063 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
2069 GSL_ERROR ("invalid length", GSL_EBADLEN);
2077 gsl_blas_strsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
2078 CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, float alpha,
2079 const gsl_matrix_float * A, gsl_matrix_float * B)
2081 const size_t M = B->size1;
2082 const size_t N = B->size2;
2083 const size_t MA = A->size1;
2084 const size_t NA = A->size2;
2088 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
2091 if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
2093 cblas_strsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
2094 alpha, A->data, INT (A->tda), B->data, INT (B->tda));
2099 GSL_ERROR ("invalid length", GSL_EBADLEN);
2105 gsl_blas_dtrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
2106 CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, double alpha,
2107 const gsl_matrix * A, gsl_matrix * B)
2109 const size_t M = B->size1;
2110 const size_t N = B->size2;
2111 const size_t MA = A->size1;
2112 const size_t NA = A->size2;
2116 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
2119 if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
2121 cblas_dtrsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
2122 alpha, A->data, INT (A->tda), B->data, INT (B->tda));
2127 GSL_ERROR ("invalid length", GSL_EBADLEN);
2133 gsl_blas_ctrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
2134 CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
2135 const gsl_complex_float alpha,
2136 const gsl_matrix_complex_float * A,
2137 gsl_matrix_complex_float * B)
2139 const size_t M = B->size1;
2140 const size_t N = B->size2;
2141 const size_t MA = A->size1;
2142 const size_t NA = A->size2;
2146 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
2149 if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
2151 cblas_ctrsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
2152 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
2158 GSL_ERROR ("invalid length", GSL_EBADLEN);
2164 gsl_blas_ztrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo,
2165 CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag,
2166 const gsl_complex alpha, const gsl_matrix_complex * A,
2167 gsl_matrix_complex * B)
2169 const size_t M = B->size1;
2170 const size_t N = B->size2;
2171 const size_t MA = A->size1;
2172 const size_t NA = A->size2;
2176 GSL_ERROR ("matrix A must be square", GSL_ENOTSQR);
2179 if ((Side == CblasLeft && M == MA) || (Side == CblasRight && N == MA))
2181 cblas_ztrsm (CblasRowMajor, Side, Uplo, TransA, Diag, INT (M), INT (N),
2182 GSL_COMPLEX_P (&alpha), A->data, INT (A->tda), B->data,
2188 GSL_ERROR ("invalid length", GSL_EBADLEN);