使用 gsl、Blas 和 Lapack 计算 (Aᵀ×A)*(Bᵀ×B) 矩阵
Compute (Aᵀ×A)*(Bᵀ×B) matrix using gsl, Blas and Lapack
让我有 2 个对称矩阵:
A = {{1,2}, {2,3}}
B = {{2,3},{3,4}}
我可以使用 gsl、Blas 和 Lapack 计算矩阵 (AT×A)*(BT×B) 吗?
我正在使用
gsl_blas_dsyrk(CblasUpper, CblasTrans, 1.0, A, 0.0, ATA);
gsl_blas_dsyrk(CblasUpper, CblasTrans, 1.0, B, 0.0, BTB);
gsl_blas_dsymm(CblasLeft, CblasUpper, 1.0, ATA, BTB, 0.0, ATABTB); // It doesn't work
它returns:
(Aᵀ·A) = ATA = {{5, 8}, {0, 13}} -- ok, gsl_blas_dsyrk returns symmetric matrix as upper triangular matrix.
(Bᵀ·B) = BTB = {{13, 8}, {0, 25}} -- ok.
(Aᵀ·A)·(Bᵀ·B) = ATABTB = {{65, 290}, {104, 469}} -- it's wrong.
对称BTB问题就解决了
如您所见,对称矩阵的上三角部分由 dsyrk()
计算。然后应用 dsymm()
。根据dsymm()
, the following operation is performed since the flag CblasLeft
的定义使用:
C := alpha*A*B + beta*C
where alpha and beta are scalars, A is a symmetric matrix and B and
C are m by n matrices.
的确,B矩阵是一般矩阵,不一定是对称矩阵。结果,ATA 乘以 BTB 的上三角部分,因为未计算 BTB 的下三角部分。
将 BTB 对称化,问题将得到解决。为此,for 循环是一个直接的解决方案,请参阅
让我有 2 个对称矩阵:
A = {{1,2}, {2,3}}
B = {{2,3},{3,4}}
我可以使用 gsl、Blas 和 Lapack 计算矩阵 (AT×A)*(BT×B) 吗?
我正在使用
gsl_blas_dsyrk(CblasUpper, CblasTrans, 1.0, A, 0.0, ATA);
gsl_blas_dsyrk(CblasUpper, CblasTrans, 1.0, B, 0.0, BTB);
gsl_blas_dsymm(CblasLeft, CblasUpper, 1.0, ATA, BTB, 0.0, ATABTB); // It doesn't work
它returns:
(Aᵀ·A) = ATA = {{5, 8}, {0, 13}} -- ok, gsl_blas_dsyrk returns symmetric matrix as upper triangular matrix.
(Bᵀ·B) = BTB = {{13, 8}, {0, 25}} -- ok.
(Aᵀ·A)·(Bᵀ·B) = ATABTB = {{65, 290}, {104, 469}} -- it's wrong.
对称BTB问题就解决了
如您所见,对称矩阵的上三角部分由 dsyrk()
计算。然后应用 dsymm()
。根据dsymm()
, the following operation is performed since the flag CblasLeft
的定义使用:
C := alpha*A*B + beta*C
where alpha and beta are scalars, A is a symmetric matrix and B and C are m by n matrices.
的确,B矩阵是一般矩阵,不一定是对称矩阵。结果,ATA 乘以 BTB 的上三角部分,因为未计算 BTB 的下三角部分。
将 BTB 对称化,问题将得到解决。为此,for 循环是一个直接的解决方案,请参阅