📄 blas3pp.h
字号:
// -*-C++-*- // Copyright (C) 2004 // Christian Stimming <stimming@tuhh.de>// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License as// published by the Free Software Foundation; either version 2, or (at// your option) any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU Lesser General Public License for more details.// You should have received a copy of the GNU Lesser General Public License along// with this library; see the file COPYING. If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,// USA.// LAPACK++ (V. 1.1)// (C) 1992-1996 All Rights Reserved./** @file blas3pp.h * @brief Blas Level-3 Routines: Matrix-Matrix Operations and Matrix norms. */#ifndef _BLAS3_PP_H_#define _BLAS3_PP_H_#include <cmath>#include "lafnames.h"#include "arch.h" // needed for DLLIMPORT#ifdef LA_COMPLEX_SUPPORT# include "lacomplex.h"#endif#ifndef DOXYGEN_IGNORE// Forward declaration of classesclass LaGenMatDouble;class LaVectorDouble;class LaGenMatComplex;class LaSymmMatDouble;class LaBandMatDouble;class LaSpdMatDouble;class LaSymmTridiagMatDouble;class LaTridiagMatDouble;#endif // DOXYGEN_IGNORE/** @name Real-valued general matrices *///@{/** Perform the matrix-matrix operation C := alpha*A*B + beta*C * where A and B are used in either non-transposed or transposed * form, depending on the function arguments. * * Internally this uses @c dgemm . * * @param transpose_A If true, use transposed A, i.e. A' instead * of A. If false, use A directly in non-transposed form. * * @param transpose_B If true, use transposed B, i.e. B' instead * of B. If false, use B directly in non-transposed form. * * (New in lapackpp-2.4.14.) */DLLIMPORTvoid Blas_Mat_Mat_Mult(const LaGenMatDouble &A, const LaGenMatDouble &B, LaGenMatDouble &C, bool transpose_A, bool transpose_B = false, double alpha = 1.0, double beta = 0.0);/** Perform the matrix-matrix operation C := alpha*A*B + beta*C */DLLIMPORTvoid Blas_Mat_Mat_Mult(const LaGenMatDouble &A, const LaGenMatDouble &B, LaGenMatDouble &C, double alpha = 1.0, double beta = 0.0);/** Perform the matrix-matrix operation C := alpha*A'*B + beta*C */DLLIMPORTvoid Blas_Mat_Trans_Mat_Mult(const LaGenMatDouble &A, const LaGenMatDouble &B, LaGenMatDouble &C, double alpha = 1.0, double beta = 0.0);/** Perform the matrix-matrix operation C := alpha*A*B' + beta*C */DLLIMPORTvoid Blas_Mat_Mat_Trans_Mult(const LaGenMatDouble &A, const LaGenMatDouble &B, LaGenMatDouble &C, double alpha = 1.0, double beta = 0.0);/** Perform a matrix-matrix multiplication, returning only the diagonal of the result: C := diag(A * B). FIXME: needs verification. */DLLIMPORTvoid Blas_Mat_Mat_Mult(const LaGenMatDouble &A, const LaGenMatDouble &B, LaVectorDouble &C);/** Perform a matrix-matrix multiplication, returning only the diagonal of the result: C := diag(A' * B). FIXME: needs verification. */DLLIMPORTvoid Blas_Mat_Trans_Mat_Mult(const LaGenMatDouble &A, const LaGenMatDouble &B, LaVectorDouble &C);/** Perform a matrix-matrix multiplication, returning only the diagonal of the result: C := diag(A * B'). FIXME: needs verification. */DLLIMPORTvoid Blas_Mat_Mat_Trans_Mult(const LaGenMatDouble &A, const LaGenMatDouble &B, LaVectorDouble &C);/** Matrix scaling: A := s * A * * (New in lapackpp-2.4.7.) */DLLIMPORTvoid Blas_Scale(double s, LaGenMatDouble &A);//@}#ifdef LA_COMPLEX_SUPPORT/** @name Complex-valued matrices *///@{/** Perform the matrix-matrix operation C := alpha*A*B + beta*C * where A and B are used in either non-hermitian or hermitian * form (matrix transpose and complex conjugate), depending on the * function arguments. * * Internally this uses @c zgemm . * * @param hermit_A If true, use hermitian A, i.e. A* (sometimes * denoted conj(A')), the matrix transpose and complex conjugate, * instead of A. If false, use A directly in non-hermitian form. * * @param hermit_B If true, use hermitian B, i.e. B* (sometimes * denoted conj(B')), the matrix transpose and complex conjugate, * instead of B. If false, use B directly in non-hermitian form. * * (New in lapackpp-2.4.14.) */DLLIMPORTvoid Blas_Mat_Mat_Mult(const LaGenMatComplex &A, const LaGenMatComplex &B, LaGenMatComplex &C, bool hermit_A, bool hermit_B = false, LaComplex alpha = 1.0, LaComplex beta = 0.0);/** Perform the matrix-matrix operation C := alpha*A*B + beta*C */DLLIMPORTvoid Blas_Mat_Mat_Mult(const LaGenMatComplex &A, const LaGenMatComplex &B, LaGenMatComplex &C, LaComplex alpha = 1.0, LaComplex beta = 0.0);/** Perform the matrix-matrix operation C := alpha*A'*B + beta*C */DLLIMPORTvoid Blas_Mat_Trans_Mat_Mult(const LaGenMatComplex &A, const LaGenMatComplex &B, LaGenMatComplex &C, LaComplex alpha = 1.0, LaComplex beta = 0.0);/** Perform the matrix-matrix operation C := alpha*A*B' + beta*C */DLLIMPORTvoid Blas_Mat_Mat_Trans_Mult(const LaGenMatComplex &A, const LaGenMatComplex &B, LaGenMatComplex &C, LaComplex alpha = 1.0, LaComplex beta = 0.0);/** Matrix scaling: A := s * A * * (New in lapackpp-2.4.7.) */DLLIMPORTvoid Blas_Scale(COMPLEX s, LaGenMatComplex &A);//@}#endif // LA_COMPLEX_SUPPORT#ifdef _LA_UNIT_LOWER_TRIANG_MAT_DOUBLE_H_DLLIMPORTvoid Blas_Mat_Mat_Solve(LaUnitLowerTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);#endif#ifdef _LA_UNIT_UPPER_TRIANG_MAT_DOUBLE_H_DLLIMPORTvoid Blas_Mat_Mat_Mult(LaUnitUpperTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);DLLIMPORTvoid Blas_Mat_Mat_Solve(LaUnitUpperTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);#endif#ifdef _LA_LOWER_TRIANG_MAT_DOUBLE_H_DLLIMPORTvoid Blas_Mat_Mat_Mult(LaLowerTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);DLLIMPORTvoid Blas_Mat_Mat_Solve(LaLowerTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);#endif#ifdef _LA_UPPER_TRIANG_MAT_DOUBLE_H_DLLIMPORTvoid Blas_Mat_Mat_Mult(LaUpperTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);DLLIMPORTvoid Blas_Mat_Mat_Solve(LaUpperTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);#endif#ifdef _LA_UNIT_LOWER_TRIANG_MAT_DOUBLE_H_DLLIMPORTvoid Blas_Mat_Trans_Mat_Solve(LaUnitLowerTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);#endif#ifdef _LA_UNIT_UPPER_TRIANG_MAT_DOUBLE_H_DLLIMPORTvoid Blas_Mat_Trans_Mat_Solve(LaUnitUpperTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);#endif#ifdef _LA_UNIT_LOWER_TRIANG_MAT_DOUBLE_H_DLLIMPORTvoid Blas_Mat_Mat_Mult(LaUnitLowerTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);#endif#ifdef _LA_LOWER_TRIANG_MAT_DOUBLE_H_DLLIMPORTvoid Blas_Mat_Trans_Mat_Solve(LaLowerTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);#endif#ifdef _LA_UPPER_TRIANG_MAT_DOUBLE_H_ DLLIMPORTvoid Blas_Mat_Trans_Mat_Solve(LaUpperTriangMatDouble &A, LaGenMatDouble &B, double alpha = 1.0);#endif/** @name Symmetric matrices *///@{/*** Perform one of the matrix-matrix operations* - A := alpha*B*C + beta*A if b_left_side is true* - A := alpha*C*B + beta*A if b_left_side is false**/DLLIMPORTvoid Blas_Mat_Mat_Mult(LaSymmMatDouble &A, LaGenMatDouble &B, LaGenMatDouble &C, double alpha = 1.0, double beta = 1.0, bool b_left_side = true);/*** Perform one of the matrix-matrix operations* - C := alpha*A*A' + beta*C if right_transposed is true* - C := alpha*A'*A + beta*C if right_transposed is false** with A' as transposition of A.**/DLLIMPORTvoid Blas_R1_Update(LaSymmMatDouble &C, LaGenMatDouble &A, double alpha = 1.0, double beta = 1.0, bool right_transposed = true);/*** Perform one of the matrix-matrix operations* - C := alpha*A*B' + alpha*B*A' + beta*C if right_transposed is true* - C := alpha*A'*B + alpha*B'*A + beta*C if right_transposed is false** with A' and B' as transposition of A and B.**/DLLIMPORTvoid Blas_R2_Update(LaSymmMatDouble &C, LaGenMatDouble &A, LaGenMatDouble &B, double alpha = 1.0, double beta = 1.0, bool right_transposed = true);//@}//-------------------------------------/// @name Matrix Norms//-------------------------------------//@{/** \brief 1-Norm: Maximum column sum * * Returns the 1-Norm of matrix A, which is the maximum * absolute column sum: \f$||A||_{\infty}=\max_j\sum_{i=1}^M|a_{ij}|\f$, * * \see Eric W. Weisstein. "Matrix Norm." From MathWorld--A Wolfram * Web Resource. http://mathworld.wolfram.com/MatrixNorm.html */DLLIMPORTdouble Blas_Norm1(const LaGenMatDouble &A);/** \brief Infinity-Norm: Maximum row sum * * Returns the Infinity-Norm of matrix A, which is the maximum * absolute row sum: \f$||A||_{\infty}=\max_i\sum_{j=1}^N|a_{ij}|\f$, * * \see Eric W. Weisstein. "Matrix Norm." From MathWorld--A Wolfram * Web Resource. http://mathworld.wolfram.com/MatrixNorm.html */DLLIMPORTdouble Blas_Norm_Inf(const LaGenMatDouble &A);/** \brief Frobenius-Norm * * Returns the Frobenius-Norm of matrix A (also called the Schur- * or Euclidean norm): \f$||A||_F=\sqrt{\sum_{i,j}|a_{ij}|^2}\f$, * i.e. the square root of the sum of the absolute squares of its * elements. * * \see Eric W. Weisstein. "Matrix Norm." From MathWorld--A Wolfram * Web Resource. http://mathworld.wolfram.com/MatrixNorm.html */DLLIMPORTdouble Blas_NormF(const LaGenMatDouble &A);/** \brief 1-Norm: Maximum column sum * * Returns the 1-Norm of matrix A, which is the maximum * absolute column sum: \f$||A||_{\infty}=\max_j\sum_{i=1}^M|a_{ij}|\f$, * * \see Eric W. Weisstein. "Matrix Norm." From MathWorld--A Wolfram * Web Resource. http://mathworld.wolfram.com/MatrixNorm.html */DLLIMPORTdouble Blas_Norm1(const LaGenMatComplex &A);/** \brief Infinity-Norm: Maximum row sum * * Returns the Infinity-Norm of matrix A, which is the maximum * absolute row sum: \f$||A||_{\infty}=\max_i\sum_{j=1}^N|a_{ij}|\f$, * * \see Eric W. Weisstein. "Matrix Norm." From MathWorld--A Wolfram * Web Resource. http://mathworld.wolfram.com/MatrixNorm.html */DLLIMPORTdouble Blas_Norm_Inf(const LaGenMatComplex &A);/** \brief Frobenius-Norm * * Returns the Frobenius-Norm of matrix A (also called the Schur- * or Euclidean norm): \f$||A||_F=\sqrt{\sum_{i,j}|a_{ij}|^2}\f$, * i.e. the square root of the sum of the absolute squares of its * elements. * * \see Eric W. Weisstein. "Matrix Norm." From MathWorld--A Wolfram * Web Resource. http://mathworld.wolfram.com/MatrixNorm.html */DLLIMPORTdouble Blas_NormF(const LaGenMatComplex &A);#ifndef DOXYGEN_IGNORE/** DEPRECATED, use Blas_Norm_Inf instead. */DLLIMPORTdouble Norm_Inf(const LaGenMatDouble &A);/** DEPRECATED, use Blas_Norm_Inf instead. */DLLIMPORTdouble Norm_Inf(const LaGenMatComplex &A);#endif // DOXYGEN_IGNOREDLLIMPORTdouble Norm_Inf(const LaBandMatDouble &A);DLLIMPORTdouble Norm_Inf(const LaSymmMatDouble &S);DLLIMPORTdouble Norm_Inf(const LaSpdMatDouble &S);DLLIMPORTdouble Norm_Inf(const LaSymmTridiagMatDouble &S);DLLIMPORTdouble Norm_Inf(const LaTridiagMatDouble &T);//@}#endif // _BLAS3_PP_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -