Matrix 使用gsl、Blas和Lapack计算(Aᵀ;×;A)*(Bᵀ;×;B)矩阵

Matrix 使用gsl、Blas和Lapack计算(Aᵀ;×;A)*(Bᵀ;×;B)矩阵,matrix,matrix-multiplication,lapack,blas,gsl,Matrix,Matrix Multiplication,Lapack,Blas,Gsl,让我有两个对称矩阵: 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.

让我有两个对称矩阵:

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
它返回:

(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()
。根据的定义,自使用标志以来执行以下操作:

其中alpha和beta是标量,A是对称矩阵,B和 C是m乘n的矩阵

实际上,B矩阵是一个一般矩阵,不一定是对称矩阵。因此,ATA乘以BTB的上三角部分,因为BTB的下三角部分未计算


对称化BTB,问题就会解决。为此,for loops是一个简单的解决方案,请参阅

C := alpha*A*B + beta*C