#### 13.1.3 Level 3

Function: int gsl_blas_sgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB, float alpha, const gsl_matrix_float * A, const gsl_matrix_float * B, float beta, gsl_matrix_float * C)
Function: int gsl_blas_dgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB, double alpha, const gsl_matrix * A, const gsl_matrix * B, double beta, gsl_matrix * C)
Function: int gsl_blas_cgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB, const gsl_complex_float alpha, const gsl_matrix_complex_float * A, const gsl_matrix_complex_float * B, const gsl_complex_float beta, gsl_matrix_complex_float * C)
Function: int gsl_blas_zgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB, const gsl_complex alpha, const gsl_matrix_complex * A, const gsl_matrix_complex * B, const gsl_complex beta, gsl_matrix_complex * C)

  These functions compute the matrix-matrix product and sum C = \alpha op(A) op(B) + \beta C where op(A) = A, A^T, A^H for TransA = `CblasNoTrans`, `CblasTrans`, `CblasConjTrans` and similarly for the parameter TransB.

Function: int gsl_blas_ssymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, float alpha, const gsl_matrix_float * A, const gsl_matrix_float * B, float beta, gsl_matrix_float * C)
Function: int gsl_blas_dsymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, double alpha, const gsl_matrix * A, const gsl_matrix * B, double beta, gsl_matrix * C)
Function: int gsl_blas_csymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, const gsl_complex_float alpha, const gsl_matrix_complex_float * A, const gsl_matrix_complex_float * B, const gsl_complex_float beta, gsl_matrix_complex_float * C)
Function: int gsl_blas_zsymm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, const gsl_complex alpha, const gsl_matrix_complex * A, const gsl_matrix_complex * B, const gsl_complex beta, gsl_matrix_complex * C)

  These functions compute the matrix-matrix product and sum C = \alpha A B + \beta C for Side is `CblasLeft` and C = \alpha B A + \beta C for Side is `CblasRight`, where the matrix A is symmetric. When Uplo is `CblasUpper` then the upper triangle and diagonal of A are used, and when Uplo is `CblasLower` then the lower triangle and diagonal of A are used.

Function: int gsl_blas_chemm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, const gsl_complex_float alpha, const gsl_matrix_complex_float * A, const gsl_matrix_complex_float * B, const gsl_complex_float beta, gsl_matrix_complex_float * C)
Function: int gsl_blas_zhemm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, const gsl_complex alpha, const gsl_matrix_complex * A, const gsl_matrix_complex * B, const gsl_complex beta, gsl_matrix_complex * C)

  These functions compute the matrix-matrix product and sum C = \alpha A B + \beta C for Side is `CblasLeft` and C = \alpha B A + \beta C for Side is `CblasRight`, where the matrix A is hermitian. When Uplo is `CblasUpper` then the upper triangle and diagonal of A are used, and when Uplo is `CblasLower` then the lower triangle and diagonal of A are used. The imaginary elements of the diagonal are automatically set to zero.

Function: int gsl_blas_strmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, float alpha, const gsl_matrix_float * A, gsl_matrix_float * B)
Function: int gsl_blas_dtrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, double alpha, const gsl_matrix * A, gsl_matrix * B)
Function: int gsl_blas_ctrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, const gsl_complex_float alpha, const gsl_matrix_complex_float * A, gsl_matrix_complex_float * B)
Function: int gsl_blas_ztrmm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, const gsl_complex alpha, const gsl_matrix_complex * A, gsl_matrix_complex * B)

  These functions compute the matrix-matrix product B = \alpha op(A) B for Side is `CblasLeft` and B = \alpha B op(A) for Side is `CblasRight`. The matrix A is triangular and op(A) = A, A^T, A^H for TransA = `CblasNoTrans`, `CblasTrans`, `CblasConjTrans`. When Uplo is `CblasUpper` then the upper triangle of A is used, and when Uplo is `CblasLower` then the lower triangle of A is used. If Diag is `CblasNonUnit` then the diagonal of A is used, but if Diag is `CblasUnit` then the diagonal elements of the matrix A are taken as unity and are not referenced.

Function: int gsl_blas_strsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, float alpha, const gsl_matrix_float * A, gsl_matrix_float * B)
Function: int gsl_blas_dtrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, double alpha, const gsl_matrix * A, gsl_matrix * B)
Function: int gsl_blas_ctrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, const gsl_complex_float alpha, const gsl_matrix_complex_float * A, gsl_matrix_complex_float * B)
Function: int gsl_blas_ztrsm (CBLAS_SIDE_t Side, CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t TransA, CBLAS_DIAG_t Diag, const gsl_complex alpha, const gsl_matrix_complex * A, gsl_matrix_complex * B)

  These functions compute the inverse-matrix matrix product B = \alpha op(inv(A))B for Side is `CblasLeft` and B = \alpha B op(inv(A)) for Side is `CblasRight`. The matrix A is triangular and op(A) = A, A^T, A^H for TransA = `CblasNoTrans`, `CblasTrans`, `CblasConjTrans`. When Uplo is `CblasUpper` then the upper triangle of A is used, and when Uplo is `CblasLower` then the lower triangle of A is used. If Diag is `CblasNonUnit` then the diagonal of A is used, but if Diag is `CblasUnit` then the diagonal elements of the matrix A are taken as unity and are not referenced.

Function: int gsl_blas_ssyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha, const gsl_matrix_float * A, float beta, gsl_matrix_float * C)
Function: int gsl_blas_dsyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha, const gsl_matrix * A, double beta, gsl_matrix * C)
Function: int gsl_blas_csyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, const gsl_complex_float alpha, const gsl_matrix_complex_float * A, const gsl_complex_float beta, gsl_matrix_complex_float * C)
Function: int gsl_blas_zsyrk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, const gsl_complex alpha, const gsl_matrix_complex * A, const gsl_complex beta, gsl_matrix_complex * C)

  These functions compute a rank-k update of the symmetric matrix C, C = \alpha A A^T + \beta C when Trans is `CblasNoTrans` and C = \alpha A^T A + \beta C when Trans is `CblasTrans`. Since the matrix C is symmetric only its upper half or lower half need to be stored. When Uplo is `CblasUpper` then the upper triangle and diagonal of C are used, and when Uplo is `CblasLower` then the lower triangle and diagonal of C are used.

Function: int gsl_blas_cherk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha, const gsl_matrix_complex_float * A, float beta, gsl_matrix_complex_float * C)
Function: int gsl_blas_zherk (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha, const gsl_matrix_complex * A, double beta, gsl_matrix_complex * C)

  These functions compute a rank-k update of the hermitian matrix C, C = \alpha A A^H + \beta C when Trans is `CblasNoTrans` and C = \alpha A^H A + \beta C when Trans is `CblasConjTrans`. Since the matrix C is hermitian only its upper half or lower half need to be stored. When Uplo is `CblasUpper` then the upper triangle and diagonal of C are used, and when Uplo is `CblasLower` then the lower triangle and diagonal of C are used. The imaginary elements of the diagonal are automatically set to zero.

Function: int gsl_blas_ssyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, float alpha, const gsl_matrix_float * A, const gsl_matrix_float * B, float beta, gsl_matrix_float * C)
Function: int gsl_blas_dsyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, double alpha, const gsl_matrix * A, const gsl_matrix * B, double beta, gsl_matrix * C)
Function: int gsl_blas_csyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, const gsl_complex_float alpha, const gsl_matrix_complex_float * A, const gsl_matrix_complex_float * B, const gsl_complex_float beta, gsl_matrix_complex_float * C)
Function: int gsl_blas_zsyr2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, const gsl_complex alpha, const gsl_matrix_complex * A, const gsl_matrix_complex * B, const gsl_complex beta, gsl_matrix_complex * C)

  These functions compute a rank-2k update of the symmetric matrix C, C = \alpha A B^T + \alpha B A^T + \beta C when Trans is `CblasNoTrans` and C = \alpha A^T B + \alpha B^T A + \beta C when Trans is `CblasTrans`. Since the matrix C is symmetric only its upper half or lower half need to be stored. When Uplo is `CblasUpper` then the upper triangle and diagonal of C are used, and when Uplo is `CblasLower` then the lower triangle and diagonal of C are used.

Function: int gsl_blas_cher2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, const gsl_complex_float alpha, const gsl_matrix_complex_float * A, const gsl_matrix_complex_float * B, float beta, gsl_matrix_complex_float * C)
Function: int gsl_blas_zher2k (CBLAS_UPLO_t Uplo, CBLAS_TRANSPOSE_t Trans, const gsl_complex alpha, const gsl_matrix_complex * A, const gsl_matrix_complex * B, double beta, gsl_matrix_complex * C)

  These functions compute a rank-2k update of the hermitian matrix C, C = \alpha A B^H + \alpha^* B A^H + \beta C when Trans is `CblasNoTrans` and C = \alpha A^H B + \alpha^* B^H A + \beta C when Trans is `CblasConjTrans`. Since the matrix C is hermitian only its upper half or lower half need to be stored. When Uplo is `CblasUpper` then the upper triangle and diagonal of C are used, and when Uplo is `CblasLower` then the lower triangle and diagonal of C are used. The imaginary elements of the diagonal are automatically set to zero.