Fortran BLAS gemm
함수를 사용하여 행렬 곱셈을 수행하려고합니다. 자세한 내용은 here을 참조하십시오.C- 연속 행렬의 Fortran gemm 함수
이 함수의 서명은 위의 링크에서 모든 매개 변수의 의미를 찾을 수 있습니다.
call sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
내 문제는 내가 대신 포트란 연속 사람의 C-연속 배열을 사용하려면, 나는 몹시 혼란 여전히 꽤 동안 위 sgemm
와 함께 놀았 던 점이다.
몇 가지 구체적인 예를 살펴 보겠습니다.
모든 입력 배열은 C 연속입니다.
a = [[0,1],
[2,3]]
b = [[0,1,2],
[3,4,5]]
# pre-alloc memory for c
c = [[0,0,0],
[0,0,0]]
# compute c = a * b, which should be as follows
# c = [[3,4,5],
# [9,14,19]]
# since sgemm assumes Fortran-contiguous, so I thought it would be
sgemm('T', 'T', 2, 3, 2, 1.0, a, 2, b, 3, 0, c, 2)
~~~~~~~ ~~~~~~~ ~~~ ~~~ ~~~
trans both m,n,k lda ldb ldc
# HOWEVER, c is not what I expected,
c = [[3,9,4],
[14,5,19]]
분명히 sgemm은이 문제를 해결하는 방법으로 포트란 인접 순서로 요소를 저장합니까? 또한 나는 그 방법이 매우 이해가 안되는 가 결정되는 경우 transa/transb='T' or 'N'
, 당신이 나에게 상세한 설명을 줄 수 있기를 바랍니다.
참고
내가 의미 scipy.linalg.cython_blas에서 내 보낸이 gemm
기능을 사용하고, 내가 대신 포트란 주문 물건을 재생 다른 선택의 여지가 없다.
나는 C^T = B^T의 * A를^T''당신의 관점을 가지고,하지만 난이'M, N, k는, LDA는, LDB는, ldc'이 있어야 할 것을 몹시 혼란 스러워요 내가 transa를 사용하면 transb = 'T'또는 'N'? – avocado
@loganecolss 링크를 추가했습니다. – kangshiyin
네, 확실히'numpy.dot'에 대해서 알고 있습니다 만,'C' 배열을 다루고 있기 때문에 Cython과 저수준 젬을 사용합니다. – avocado