Матрица-вектор-умножение, Потерянное в Лапаке

#matrix #vector #multiplication #lapack

Вопрос:

Я хотел бы вычислить

x^T A x* (x транспонированная матрица времен A, умноженная на x сопряженный комплекс)

с помощью Лапака. Я не нашел для этого функции. Или есть такой? Каков самый быстрый способ сделать это?

Комментарии:

1. Я полагаю, вы спрашиваете о коде Фортрана?

Ответ №1:

Вы можете вычислить операцию в два отдельных шага:

  1. вычислять y <- A x*
  2. вычислять res <- x^T y

Я реализовал это в следующей программе

 program main

  use blas95

  implicit none

  integer, parameter :: n = 2
  complex :: x(n), y(n), A(n,n), res

  complex :: cdotu

  ! init vector x, matrix A by some data
  x = [(1, 1), (-1, 2)]
  A = reshape([1, 2, 3, 4], [n, n])

  ! compute: y <- A * conjg(x)
  call cgemv('N', n, n, (1, 0), A, n, conjg(x), 1, (0, 0), y, 1)    ! standard BLAS
  call gemv(A, conjg(x), y)                                         ! BLAS95 from intel MKL

  ! compute: res <- x^T * y
  res = cdotu(n, x, 1, y, 1)                                        ! standard BLAS
  res = dotu(x, y)                                                  ! BLAS95 from intel MKL
end program
 

Примечание: Я включил стандартные процедуры BLAS, а также процедуры BLAS95, доступные через MKL intel.


Ссылка на документацию intel по