2011-01-09 2 views
1

J'ai cherché une documentation décente sur blas, et j'ai trouvé quelque 315 pages de matériel dense sur lesquelles ctrl-f ne fonctionne pas. Il fournit toutes les informations concernant les arguments d'entrée que les routines prennent, mais il y a BEAUCOUP d'arguments d'entrée et je pourrais vraiment utiliser un exemple de code. Je suis incapable d'en trouver. Je sais qu'il doit y en avoir quelques uns ou que personne ne pourra utiliser ces librairies! En particulier, j'utilise ATLAS installé via macports sur un mac osx 10.5.8 et j'utilise gfortran de gcc 4.4 (également installé via macports). Je suis en train de coder dans Fortran 90. Je suis encore relativement nouveau pour Fortran, mais j'ai une bonne expérience avec mathematica, matlab, perl et shell scripting. Je souhaiterais pouvoir initialiser et multiplier un vecteur complexe dense par une matrice complexe dense (mais non hermitienne). Les éléments de la matrice sont définis par une fonction mathématique des indices - appelons-la f (i, j).Où puis-je trouver l'exemple de code BLAS (en Fortran)?

Quelqu'un pourrait-il fournir du code ou un lien vers un code?

Répondre

4

A partir de http://www.netlib.org/blas/, vous voyez que la routine que vous cherchez est zgemv, ici http://www.netlib.org/blas/zgemv.f --- c'est un complexe ('z') matrice ('m') vecteur ('v') multipliez. Si vos vecteurs ne sont que des tableaux normaux, c'est-à-dire qu'ils sont contigus en mémoire, alors les arguments INCX et INCY sont juste 1. En ce qui concerne le paramètre LDA, gardez-le égal à la taille de la matrice. D'autres paramètres sont simples. Par exemple:

implicit none 

    integer, parameter :: N=2 

    complex*16, parameter :: imag1 = cmplx(0.d0, 1.d0) 
    complex*16 :: a(N,N), x(N), y(N) 

    complex*16 :: alpha, beta 

    a(:,:)=imag1; 
    x(:)=1.d0 
    y(:)=0.d0 

    alpha=1.d0; beta=0.d0 

    call zgemv('N',N,N,alpha,a,N,x,1,beta,y,1) 


    print*, y 


    end  

En général, chaque fois que je besoin d'une routine BLAS ou LAPACK, je regarde les paramètres sur netlib.

EDIT: le code ci-dessus n'utilise pas le fait que votre matrice est symétrique. Si vous le souhaitez, recherchez la routine zsymv. (Merci à @MRocklin.)

+0

Si vous cherchez symétrique, vous voulez probablement 'zsymv', pas' ztrmv'. le préfixe TR est pour triangulaire. – MRocklin

+0

@MRocklin qui dépend du stockage. Pour une matrice symmetrix, il suffit de stocker une matrice triangulaire supérieure (ou inférieure). Si la matrice entière est stockée (pourquoi ferait-on cela?), Alors, je suis d'accord, c'est 'zsymv'. –

+0

Non, TR et SY utilisent le même stockage. Les méthodes SY supposent simplement que la matrice est reflétée de l'autre côté. J'ai écrit un petit programme fortran pour démontrer que le trmv donne des résultats incorrects dans cette situation alors que symv donne les bons. https://gist.github.com/3946486 – MRocklin