Code covered by the BSD License  

Highlights from
slatec

from slatec by Ben Barrowes
The slatec library converted into matlab functions.

[uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc]=dsyr2k(uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc);
function [uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc]=dsyr2k(uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc);
%***BEGIN PROLOGUE  DSYR2K
%***PURPOSE  Perform one of the symmetric rank 2k operations.
%***LIBRARY   SLATEC (BLAS)
%***CATEGORY  D1B6
%***TYPE      doubleprecision (SSYR2-S, DSYR2-D, CSYR2-C, DSYR2K-D)
%***KEYWORDS  LEVEL 3 BLAS, LINEAR ALGEBRA
%***AUTHOR  Dongarra, J., (ANL)
%           Duff, I., (AERE)
%           Du Croz, J., (NAG)
%           Hammarling, S. (NAG)
%***DESCRIPTION
%
%  DSYR2K  performs one of the symmetric rank 2k operations
%
%     C := alpha*A*B' + alpha*B*A' + beta*C,
%
%  or
%
%     C := alpha*A'*B + alpha*B'*A + beta*C,
%
%  where  alpha and beta  are scalars, C is an  n by n  symmetric matrix
%  and  A and B  are  n by k  matrices  in the  first  case  and  k by n
%  matrices in the second case.
%
%  Parameters
%  ==========
%
%  UPLO   - CHARACTER*1.
%           On  entry,   UPLO  specifies  whether  the  uppermlv  or  lower
%           triangular  part  of the  array  C  is to be  referenced  as
%           follows:
%
%              UPLO = 'U' or 'u'   Only the  uppermlv triangular part of  C
%                                  is to be referenced.
%
%              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
%                                  is to be referenced.
%
%           Unchanged on exit.
%
%  TRANS  - CHARACTER*1.
%           On entry,  TRANS  specifies the operation to be performed as
%           follows:
%
%              TRANS = 'N' or 'n'   C := alpha*A*B' + alpha*B*A' +
%                                        beta*C.
%
%              TRANS = 'T' or 't'   C := alpha*A'*B + alpha*B'*A +
%                                        beta*C.
%
%              TRANS = 'C' or 'c'   C := alpha*A'*B + alpha*B'*A +
%                                        beta*C.
%
%           Unchanged on exit.
%
%  N      - INTEGER.
%           On entry,  N specifies the order of the matrix C.  N must be
%           at least zero.
%           Unchanged on exit.
%
%  K      - INTEGER.
%           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
%           of  columns  of the  matrices  A and B,  and on  entry  with
%           TRANS = 'T' or 't' or 'C' or 'c',  K  specifies  the  number
%           of rows of the matrices  A and B.  K must be at least  zero.
%           Unchanged on exit.
%
%  ALPHA  - doubleprecision.
%           On entry, ALPHA specifies the scalar alpha.
%           Unchanged on exit.
%
%  A      - doubleprecision array of DIMENSION ( LDA, ka ), where ka is
%           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
%           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
%           part of the array  A  must contain the matrix  A,  otherwise
%           the leading  k by n  part of the array  A  must contain  the
%           matrix A.
%           Unchanged on exit.
%
%  LDA    - INTEGER.
%           On entry, LDA specifies the first dimension of A as declared
%           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
%           then  LDA must be at least  max( 1, n ), otherwise  LDA must
%           be at least  max( 1, k ).
%           Unchanged on exit.
%
%  B      - doubleprecision array of DIMENSION ( LDB, kb ), where kb is
%           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
%           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
%           part of the array  B  must contain the matrix  B,  otherwise
%           the leading  k by n  part of the array  B  must contain  the
%           matrix B.
%           Unchanged on exit.
%
%  LDB    - INTEGER.
%           On entry, LDB specifies the first dimension of B as declared
%           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
%           then  LDB must be at least  max( 1, n ), otherwise  LDB must
%           be at least  max( 1, k ).
%           Unchanged on exit.
%
%  BETA   - doubleprecision.
%           On entry, BETA specifies the scalar beta.
%           Unchanged on exit.
%
%  C      - doubleprecision array of DIMENSION ( LDC, n ).
%           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
%           uppermlv triangular part of the array C must contain the uppermlv
%           triangular part  of the  symmetric matrix  and the strictly
%           lower triangular part of C is not referenced.  On exit, the
%           uppermlv triangular part of the array  C is overwritten by the
%           uppermlv triangular part of the updated matrix.
%           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
%           lower triangular part of the array C must contain the lower
%           triangular part  of the  symmetric matrix  and the strictly
%           uppermlv triangular part of C is not referenced.  On exit, the
%           lower triangular part of the array  C is overwritten by the
%           lower triangular part of the updated matrix.
%
%  LDC    - INTEGER.
%           On entry, LDC specifies the first dimension of C as declared
%           in  the  calling  (sub)  program.   LDC  must  be  at  least
%           max( 1, n ).
%           Unchanged on exit.
%
%***REFERENCES  Dongarra, J., Du Croz, J., Duff, I., and Hammarling, S.
%                 A set of level 3 basic linear algebra subprograms.
%                 ACM TOMS, Vol. 16, No. 1, pp. 1-17, March 1990.
%***ROUTINES CALLED  LSAME, XERBLA
%***REVISION HISTORY  (YYMMDD)
%   890208  DATE WRITTEN
%   910605  Modified to meet SLATEC prologue standards.  Only comment
%           lines were modified.  (BKS)
%***end PROLOGUE  DSYR2K
%     .. Scalar Arguments ..
%     .. Array Arguments ..
persistent i info j l nrowa one temp1 temp2 uppermlv zero ; 

a_shape=size(a);a=reshape([a(:).',zeros(1,ceil(numel(a)./prod([lda])).*prod([lda])-numel(a))],lda,[]);
b_shape=size(b);b=reshape([b(:).',zeros(1,ceil(numel(b)./prod([ldb])).*prod([ldb])-numel(b))],ldb,[]);
c_shape=size(c);c=reshape([c(:).',zeros(1,ceil(numel(c)./prod([ldc])).*prod([ldc])-numel(c))],ldc,[]);
%
%     .. External Functions ..
%     .. External Subroutines ..
%     .. Intrinsic Functions ..
%     .. Local Scalars ..
if isempty(uppermlv), uppermlv=false; end;
if isempty(i), i=0; end;
if isempty(info), info=0; end;
if isempty(j), j=0; end;
if isempty(l), l=0; end;
if isempty(nrowa), nrowa=0; end;
if isempty(temp1), temp1=0; end;
if isempty(temp2), temp2=0; end;
%     .. Parameters ..
if isempty(one), one=1.0d+0; end;
if isempty(zero), zero=0.0d+0 ; end;
%***FIRST EXECUTABLE STATEMENT  DSYR2K
%
%     Test the input parameters.
%
if( lsame(trans,'N') )
nrowa = fix(n);
else;
nrowa = fix(k);
end;
[uppermlv ,uplo]=lsame(uplo,'U');
%
info = 0;
if( (~uppermlv) && (~lsame(uplo,'L')) )
info = 1;
elseif ( (~lsame(trans,'N')) && (~lsame(trans,'T'))&& (~lsame(trans,'C')) ) ;
info = 2;
elseif( n<0 ) ;
info = 3;
elseif( k<0 ) ;
info = 4;
elseif( lda<max(1,nrowa) ) ;
info = 7;
elseif( ldb<max(1,nrowa) ) ;
info = 9;
elseif( ldc<max(1,n) ) ;
info = 12;
end;
if( info~=0 )
[dumvar1,info]=xerbla('DSYR2K',info);
a_shape=zeros(a_shape);a_shape(:)=a(1:numel(a_shape));a=a_shape;
b_shape=zeros(b_shape);b_shape(:)=b(1:numel(b_shape));b=b_shape;
c_shape=zeros(c_shape);c_shape(:)=c(1:numel(c_shape));c=c_shape;
return;
end;
%
%     Quick return if possible.
%
if((n==0) ||(((alpha==zero) ||(k==0)) &&(beta==one)) )
a_shape=zeros(a_shape);a_shape(:)=a(1:numel(a_shape));a=a_shape;
b_shape=zeros(b_shape);b_shape(:)=b(1:numel(b_shape));b=b_shape;
c_shape=zeros(c_shape);c_shape(:)=c(1:numel(c_shape));c=c_shape;
return;
end;
%
%     And when  alpha==zero.
%
if( alpha==zero )
if( uppermlv )
if( beta==zero )
for j = 1 : n;
for i = 1 : j;
c(i,j) = zero;
end; i = fix(j+1);
end; j = fix(n+1);
else;
for j = 1 : n;
for i = 1 : j;
c(i,j) = beta.*c(i,j);
end; i = fix(j+1);
end; j = fix(n+1);
end;
elseif( beta==zero ) ;
for j = 1 : n;
for i = j : n;
c(i,j) = zero;
end; i = fix(n+1);
end; j = fix(n+1);
else;
for j = 1 : n;
for i = j : n;
c(i,j) = beta.*c(i,j);
end; i = fix(n+1);
end; j = fix(n+1);
end;
a_shape=zeros(a_shape);a_shape(:)=a(1:numel(a_shape));a=a_shape;
b_shape=zeros(b_shape);b_shape(:)=b(1:numel(b_shape));b=b_shape;
c_shape=zeros(c_shape);c_shape(:)=c(1:numel(c_shape));c=c_shape;
return;
end;
%
%     Start the operations.
%
if( lsame(trans,'N') )
%
%        Form  C := alpha*A*B' + alpha*B*A' + C.
%
if( uppermlv )
for j = 1 : n;
if( beta==zero )
for i = 1 : j;
c(i,j) = zero;
end; i = fix(j+1);
elseif( beta~=one ) ;
for i = 1 : j;
c(i,j) = beta.*c(i,j);
end; i = fix(j+1);
end;
for l = 1 : k;
if((a(j,l)~=zero) ||(b(j,l)~=zero) )
temp1 = alpha.*b(j,l);
temp2 = alpha.*a(j,l);
for i = 1 : j;
c(i,j) = c(i,j) + a(i,l).*temp1 + b(i,l).*temp2;
end; i = fix(j+1);
end;
end; l = fix(k+1);
end; j = fix(n+1);
else;
for j = 1 : n;
if( beta==zero )
for i = j : n;
c(i,j) = zero;
end; i = fix(n+1);
elseif( beta~=one ) ;
for i = j : n;
c(i,j) = beta.*c(i,j);
end; i = fix(n+1);
end;
for l = 1 : k;
if((a(j,l)~=zero) ||(b(j,l)~=zero) )
temp1 = alpha.*b(j,l);
temp2 = alpha.*a(j,l);
for i = j : n;
c(i,j) = c(i,j) + a(i,l).*temp1 + b(i,l).*temp2;
end; i = fix(n+1);
end;
end; l = fix(k+1);
end; j = fix(n+1);
end;
%
%        Form  C := alpha*A'*B + alpha*B'*A + C.
%
elseif( uppermlv ) ;
for j = 1 : n;
for i = 1 : j;
temp1 = zero;
temp2 = zero;
for l = 1 : k;
temp1 = temp1 + a(l,i).*b(l,j);
temp2 = temp2 + b(l,i).*a(l,j);
end; l = fix(k+1);
if( beta==zero )
c(i,j) = alpha.*temp1 + alpha.*temp2;
else;
c(i,j) = beta.*c(i,j) + alpha.*temp1 + alpha.*temp2;
end;
end; i = fix(j+1);
end; j = fix(n+1);
else;
for j = 1 : n;
for i = j : n;
temp1 = zero;
temp2 = zero;
for l = 1 : k;
temp1 = temp1 + a(l,i).*b(l,j);
temp2 = temp2 + b(l,i).*a(l,j);
end; l = fix(k+1);
if( beta==zero )
c(i,j) = alpha.*temp1 + alpha.*temp2;
else;
c(i,j) = beta.*c(i,j) + alpha.*temp1 + alpha.*temp2;
end;
end; i = fix(n+1);
end; j = fix(n+1);
end;
%
%
%     end of DSYR2K.
%
a_shape=zeros(a_shape);a_shape(:)=a(1:numel(a_shape));a=a_shape;
b_shape=zeros(b_shape);b_shape(:)=b(1:numel(b_shape));b=b_shape;
c_shape=zeros(c_shape);c_shape(:)=c(1:numel(c_shape));c=c_shape;
end
%DECK DSYR

Contact us