implement HEMV level2 blas routine

This commit is contained in:
Gael Guennebaud 2010-11-21 10:09:33 +01:00
parent 12bfe5e718
commit 0020ea544a

View File

@ -500,8 +500,43 @@ int EIGEN_BLAS_FUNC(spr2)(char *uplo, int *n, RealScalar *alpha, RealScalar *x,
* where alpha and beta are scalars, x and y are n element vectors and * where alpha and beta are scalars, x and y are n element vectors and
* A is an n by n hermitian matrix. * A is an n by n hermitian matrix.
*/ */
int EIGEN_BLAS_FUNC(hemv)(char *uplo, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *x, int *incx, RealScalar *pbeta, RealScalar *y, int *incy) int EIGEN_BLAS_FUNC(hemv)(char *uplo, int *n, RealScalar *palpha, RealScalar *pa, int *lda, RealScalar *px, int *incx, RealScalar *pbeta, RealScalar *py, int *incy)
{ {
Scalar* a = reinterpret_cast<Scalar*>(pa);
Scalar* x = reinterpret_cast<Scalar*>(px);
Scalar* y = reinterpret_cast<Scalar*>(py);
Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
Scalar beta = *reinterpret_cast<Scalar*>(pbeta);
// check arguments
int info = 0;
if(UPLO(*uplo)==INVALID) info = 1;
else if(*n<0) info = 2;
else if(*lda<std::max(1,*n)) info = 5;
else if(*incx==0) info = 7;
else if(*incy==0) info = 10;
if(info)
return xerbla_(SCALAR_SUFFIX_UP"HEMV ",&info,6);
if(*n==0)
return 1;
Scalar* actual_x = get_compact_vector(x,*n,*incx);
Scalar* actual_y = get_compact_vector(y,*n,*incy);
if(beta!=Scalar(1))
vector(actual_y, *n) *= beta;
if(alpha!=Scalar(0))
{
// TODO performs a direct call to the underlying implementation function
if(UPLO(*uplo)==UP) vector(actual_y,*n).noalias() += matrix(a,*n,*n,*lda).selfadjointView<Upper>() * (alpha * vector(actual_x,*n));
else if(UPLO(*uplo)==LO) vector(actual_y,*n).noalias() += matrix(a,*n,*n,*lda).selfadjointView<Lower>() * (alpha * vector(actual_x,*n));
}
if(actual_x!=x) delete[] actual_x;
if(actual_y!=y) delete[] copy_back(actual_y,y,*n,*incy);
return 1; return 1;
} }