Programowanie > Inne
mnozenie macierzy BLAS
Gosik:
Chcialabym pomnozyc dwie macierze wykorzystujac BLASa.
Stworzylam taki prosty programik w Fortranie:
--- Kod: ---
program macierz
implicit none
double precision mac(10,12),mac2(10,12)
call FILLMATRIX(10,12,mac)
call FILLMATRIX(10,12,mac2)
call
END
SUBROUTINE FILLMATRIX ( M, N, MATRIX )
INTEGER M,N
DOUBLE PRECISION MATRIX(M, N)
DO I=1,M
DO J=1,N
MATRIX(I,J) = I+2*J
end do
end do
WRITE(*,*) 'Macierz ma postac'
do I=1,M
write(*,*) (MATRIX(I,J),J=1,N)
end do
END
--- Koniec kodu ---
Znalazlam taka procedure:
call DGEEM(transA, transB, m,n,k,alpha,A, lda, B, ldb, beta, C, ldec)
Jak ja mam interpretowac?
czym sa poszczegolne oznaczenia?
wiem, ze A,B to sa dane macierze
C, szukana macierz
alpha standardowo ustawiamy na 1.0, a a beta na 0.0.
Nie wiem, co z reszta.
Czy moglibyscie mi troche pomoc?
Paweł Kraszewski:
Jesteś pewna, że DGEEM a nie DGEMM? Pierwszej nie ma w strandardowym BLASie, a druga ma taką sygnaturę, jak napisałaś. Dokumentacja drugiej jest tutaj.
Gosik:
Zgadza sie, mialo byc DGEMM.
Jednazke chyba cos zle rozumiem.
--- Kod: ---
program macierz
implicit none
double precision mac(5,6),mac2(5,6),mac3(5,6)
integer K,L
call FILLMATRIX(5,6,mac)
call FILLMATRIX(5,6,mac2)
call DGEMM("n","n",5,6,5,1.0,mac,5,mac2,5,0.0,mac3,6)
WRITE(*,*)'Macierz C ma postac'
DO K=1,5
write(*,*) (mac3(5,6),L=1,6)
end do
END
--- Koniec kodu ---
Przy wyswetlaniu macierzy mac3 uzyskuje same 0.
Czy moglabym prosic o wskazanie bledu?
Paweł Kraszewski:
Coś tenteges pamiętam przez mgłę, że wymiar X jednej mnożonej macierzy musi być równy Y drugiej (albo odwrotnie - narząd nie używany zanika). Nie da się pomnożyć macierzy 5x6 przez 5x6. 5x6 przez 6x5 tak.
Gosik:
Poprawilam moj kod:
--- Kod: ---
program macierz
implicit none
double precision mac(m,n),mac2(n,k),mac3(m,k)
integer R,L
integer m,n
integer k
m=2
n=2
k=3
call FILLMATRIX(m,n,mac)
call FILLMATRIX(n,k,mac2)
call DGEMM("n","n",m,k,n,1.d0,mac,m,mac2,k,0.d0,mac3,m)
WRITE(*,*)'Macierz C ma postac'
DO R=1,m
write(*,*) (mac3(R,L),L=1,k)
end do
END
SUBROUTINE FILLMATRIX (M,N,MATRIX)
INTEGER M,N
DOUBLE PRECISION MATRIX(M,N)
do I=1,M
do J=1,N
MATRIX(I,J) = I+2*J
end do
end do
WRITE(*,*) 'Macierz ma postac'
do I=1,M
write(*,*) (MATRIX(I,J),J=1,N)
end do
END
--- Koniec kodu ---
Jednakze, macierz mac3 jest wyswitlana w nastepujacej postaci:
--- Kod: ---
Macierz C ma postac
29.00000000000000 0.0000000000000000 0.0000000000000000
36.00000000000000 0.0000000000000000 0.0000000000000000
--- Koniec kodu ---
Dlaczego dobrze wyswietla tylko pierwsza kolumne, a reszta jest wypelnina zerami?
Nawigacja
[#] Następna strona
Idź do wersji pełnej