Programowanie > Inne

mnozenie macierzy BLAS

(1/2) > >>

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

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej