我需要为一组左右向量计算双线性形式
在哪里和(假设所有矩阵大小都有意义)。这可以在一行 MATLAB 代码中获得
要么
我的问题是,考虑到使用适当的 LAPACK/BLAS 执行此操作的最直接的 FORTRAN 实现是什么最初是作为一个实数数组给出的,并且存储为复杂的数组?
我需要为一组左右向量计算双线性形式
我将?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)
您可能不需要辅助数组C,D如果您可以覆盖一些原始数组A, U, V, 以及形状是否兼容(但我认为您不能这样做)。
当然,对于例程/函数,您需要使用参考来计算出相当多的簿记参数(主要是为了指示数组的逻辑和物理形状)。我提到了intel的BLAS,因为我很熟悉它,它是免费的,针对intel机器进行了优化,并且文档易于浏览。此外,它具有v?mul我不确定是否存在于(非英特尔)常规 BLAS 中的特性。