Где я могу найти пример кода BLAS (на Фортране)? - PullRequest
1 голос
/ 09 января 2011

Я искал приличную документацию по blas, и я нашел около 315 страниц плотного материала, на котором ctrl-f не работает. Он предоставляет всю информацию, касающуюся того, какие входные аргументы принимают подпрограммы, но есть много входных аргументов, и я мог бы действительно использовать некоторый пример кода. Я не могу найти ни одного. Я знаю, что должны быть некоторые, или никто не сможет использовать эти библиотеки!

В частности, я использую ATLAS, установленный через macports на Mac OSX 10.5.8, и использую gfortran из gcc 4.4 (также установленный через macports). Я пишу на Фортране 90. Я все еще довольно плохо знаком с Фортраном, но у меня достаточно опыта работы со скриптами mathematica, matlab, perl и shell.

Я хотел бы иметь возможность инициализировать и умножать плотный комплексный вектор на плотную симметричную (но не эрмитову) комплексную матрицу. Элементы матрицы определяются через математическую функцию индексов - назовите ее f (i, j).

Может ли кто-нибудь предоставить какой-либо код или ссылку на какой-либо код?

1 Ответ

4 голосов
/ 09 января 2011

Начиная с http://www.netlib.org/blas/,, вы видите, что искомой подпрограммой является zgemv, здесь http://www.netlib.org/blas/zgemv.f --- это вектор сложной ('z') матрицы ('m') ( 'v') умножить.

Если ваши векторы являются просто обычными массивами, то есть они непрерывны в памяти, то аргументы INCX и INCY равны 1. Что касается параметра LDA, просто оставьте его равным размеру матрицы. Другие параметры просты. Например:

  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      

В общем, каждый раз, когда мне нужна процедура BLAS или LAPACK, я просматриваю параметры в netlib.

РЕДАКТИРОВАТЬ: код выше не использует тот факт, что ваша матрица симметрична. Если вы хотите этого, то найдите подпрограмму zsymv. (Спасибо @MRocklin.)

...