#matrix #vector #multiplication #lapack
Вопрос:
Я хотел бы вычислить
x^T A x* (x транспонированная матрица времен A, умноженная на x сопряженный комплекс)
с помощью Лапака. Я не нашел для этого функции. Или есть такой? Каков самый быстрый способ сделать это?
Комментарии:
1. Я полагаю, вы спрашиваете о коде Фортрана?
Ответ №1:
Вы можете вычислить операцию в два отдельных шага:
- вычислять
y <- A x*
- вычислять
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 по