¿Dónde puedo encontrar el código de ejemplo BLAS (en Fortran)?

He estado buscando documentación decente sobre blas y he encontrado unas 315 páginas de material denso en el que ctrl-f no funciona. Proporciona toda la información sobre los argumentos de entrada que toman las rutinas, pero hay MUCHOS argumentos de entrada y realmente podría usar algún código de ejemplo. No puedo localizar ninguno. ¡Sé que tiene que haber algunas o nadie podría usar estas bibliotecas!

Específicamente, uso ATLAS instalado a través de macports en un mac osx 10.5.8 y uso gfortran de gcc 4.4 (también instalado a través de macports). Estoy codificando en Fortran 90. Todavía soy bastante nuevo en Fortran, pero tengo bastante experiencia con las secuencias de comandos mathica, matlab, perl y shell.

Me gustaría poder inicializar y multiplicar un vector complejo denso por una matriz compleja simétrica densa (pero no hermitiana). Los elementos de la matriz se definen a través de una función matemática de los índices, llámela f (i, j).

¿Alguien podría proporcionar algún código o un enlace a algún código?

preguntado el 09 de enero de 11 a las 05:01

1 Respuestas

A partir de http://www.netlib.org/blas/, ves que la rutina que estás buscando es zgemv, aquí http://www.netlib.org/blas/zgemv.f --- es una matriz compleja ('z') ('m') vector ('v') multiplicar.

Si sus vectores son simplemente arreglos normales, es decir, son contiguos en la memoria, entonces los argumentos INCX e INCY son solo 1. En lo que respecta al parámetro LDA, manténgalo igual al tamaño de la matriz. Otros parámetros son sencillos. Por ejemplo:

  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 general, cada vez que necesito una rutina BLAS o LAPACK, busco los parámetros en netlib.

EDITAR: el código anterior no usa el hecho de que su matriz es simétrica. Si lo desea, busque el zsymv rutina. (Gracias a @MRocklin.)

Respondido 25 Oct 12, 01:10

Si lo que busca es simétrico, probablemente desee zsymvno, ztrmv. el prefijo TR es triangular. - MRocklin

@MRocklin que depende del almacenamiento. Para una matriz simétrica, es suficiente almacenar una matriz triangular superior (o inferior). Si toda la matriz está almacenada (¿por qué haría uno eso?), Entonces, estoy de acuerdo, es zsymv. - ev-br

No, tanto TR como SY usan el mismo almacenamiento. Los métodos SY simplemente asumen que la matriz se refleja en el otro lado. He escrito un pequeño programa de fortran para demostrar que trmv da resultados incorrectos en esta situación, mientras que symv da los correctos. gist.github.com/3946486 - MRocklin

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.