행렬 및 벡터 곱셈이 필요한 알고리즘을 C로 작성했습니다. I는 매트릭스를 가지고 Q (W X W) 행렬 자체 갖는 벡터 J (1 x 폭)의 전치를 승산과 가산함으로써 생성되는은 I가 사용하여 스케일링 스칼라 .CBLAS/LAPACK을 사용하여 C의 대칭 행렬 반전
Q = [(J^T) * J + aI].
I는 벡터 M 얻을 벡터 G와 Q의 역수를 곱해야한다.
M = (Q^(- 1)) * G.
내 알고리즘을 개발 cblas 및 clapack를 사용하고 있습니다. 행렬 Q 는 난수 (float 형)을 사용하여 채워 루틴을 sgetrf_ 및 sgetri_를 사용하여 반전 될 때, 계산 된 역수 올바른이다.
그러나 행렬 Q가 (J^T) x J를 곱할 때 대칭 인 인 경우 계산 된 역함은 잘못되었습니다!.^C에서 LAPACK 루틴을 호출하는 동안
는 I 배열의 행 주요 (C)에서와 열 주요 (FORTRAN에서) 포맷을 알고 있지만, 대칭 행렬이이 같은 문제가 아니다 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");
}
}
고마워요, 당신의 대답은 매우 도움이되었습니다. 이전의 의견, 나를 계속 생각 해 줬어. 처음이 질문을 게시했을 때, 저는 C 함수를 테스트하고있었습니다. 테스트 단계에서 나는 (J^T) * J를 사용하여 ** Q ** 행렬을 만들었습니다. ** Q **의이 값은 역관계로 넘어 갔고 이전 주석에서 언급했듯이, Q를 완전히 계산해야합니다. Q = (J^T) * J + aI 그리고 그것을 함수로 전달하십시오. 난 그냥 matlab에이 이론을 시도하고 결과는 제안대로! **이 문제는 내 코드 **로 해결해야한다고 생각합니다 **. 다시 귀하의 도움을 주셔서 감사합니다 .. :) – Saed