我正在用 C 语言编写一个需要矩阵和向量乘法的算法。我有一个矩阵Q (W x W),它是通过将向量J (1 x W) 的转置与自身相乘并添加单位矩阵I来创建的,使用标量a进行缩放。
Q = [(J^T) * J + aI]。
然后我必须将Q 的倒数与向量 G相乘以得到向量M。
M = (Q^(-1)) * G。
我正在使用cblas和clapack来开发我的算法。当矩阵Q使用随机数(浮点类型)填充并使用例程sgetrf_和sgetri_进行反转时,计算的逆是正确的。
但是当矩阵 Q 是对称的时,当你乘以 (J^T) x J 时,计算的逆是错误的!.
在从 C 调用lapack例程时,我知道数组的行优先(在 C 中)和列优先(在 FORTRAN 中)格式,但是对于对称矩阵,这应该不是问题,因为 A^T = A.
我在下面附上了矩阵求逆的 C 函数代码。
我相信有更好的方法来解决这个问题。谁能帮我这个?
使用 cblas 的解决方案会很棒......
谢谢。
void InverseMatrix_R(float *Matrix, int W)
{
int LDA = W;
int IPIV[W];
int ERR_INFO;
int LWORK = W * W;
float Workspace[LWORK];
// - Compute the LU factorization of a M by N matrix A
sgetrf_(&W, &W, Matrix, &LDA, IPIV, &ERR_INFO);
// - Generate inverse of the matrix given its LU decompsotion
sgetri_(&W, Matrix, &LDA, IPIV, Workspace, &LWORK, &ERR_INFO);
// - Display the Inverted matrix
PrintMatrix(Matrix, W, W);
}
void PrintMatrix(float* Matrix, int row, int colm)
{
int i,k;
for (i =0; i < row; i++)
{
for (k = 0; k < colm; k++)
{
printf("%g, ",Matrix[i*colm + k]);
}
printf("\n");
}
}