使用 LAPACK 计算双线性形式

计算科学 线性代数 正则 拉帕克
2021-12-01 18:32:46

我需要为一组左右向量计算双线性形式

wk=i,jVikAijUjk,
在哪里AijRUjk,VikC(假设所有矩阵大小都有意义)。这可以在一行 MATLAB 代码中获得
w=diag(V'*A*U);
要么
w=sum(conj(V).*(A*U), 1);
我的问题是,考虑到使用适当的 LAPACK/BLAS 执行此操作的最直接的 FORTRAN 实现是什么Aij最初是作为一个实数数组给出的,并且Ujk,Vik存储为复杂的数组?

1个回答

我将?gemm用于矩阵产品* (MKL 参考)v?mulHadamard 产品.* (MKL 参考)如前所述,据我所知,您必须将所有内容都变得复杂。

假设您以双精度工作,则类似于:

Integer, Parameter :: dp = kind(1.0d0)
Real(dp), Dimension(:,:), Allocatable :: V_real
Complex(dp), Dimension(:,:), Allocatable :: A, U, V
Complex(dp), Dimension(:,:), Allocatable :: C, D ! some auxilliary arrays
Complex(dp), Dimension(:), Allocatable :: w
!allocate and define everything
!convert V from real to complex:
V = Cmplx(V_real, 0._dp, kind=dp)
!start by computing C = A*U with ?gemm
Call zgemm(..., A, ..., U, ... C, ...)
!Then compute w = sum(conj(V).*C) with vzmul
V = Conjg (V)
Call vzmul (n, V, C, D)
w = sum(D,1)

您可能不需要辅助数组CD如果您可以覆盖一些原始数组A, U, V, 以及形状是否兼容(但我认为您不能这样做)。

当然,对于例程/函数,您需要使用参考来计算出相当多的簿记参数(主要是为了指示数组的逻辑和物理形状)。我提到了intel的BLAS,因为我很熟悉它,它是免费的,针对intel机器进行了优化,并且文档易于浏览。此外,它具有v?mul我不确定是否存在于(非英特尔)常规 BLAS 中的特性。