Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. program main
  2.      implicit none
  3.    
  4.      ! Wymiary macierzy: A:x,y   B:y,z   C:x,z <- macierz wynikowa
  5.      !Jak macierze nie są kwadratowe, to 3 sposób daje złe wyniki :(, ale luz bo i tak pomiary czasu są na kwadratowych macierzach
  6.      integer, parameter :: x = 4
  7.      integer, parameter :: y = 4
  8.      integer, parameter :: z = 4
  9.  
  10.      ! Zmienne pomocnicze do iteracji
  11.      integer :: i,j,k
  12.  
  13.      ! Zmienna pomocnicza tmp, przy generowaniu wartości losowych
  14.      real(kind=4) :: tmp
  15.  
  16.      ! Macierze na których bede pracować:
  17.      real :: A,B,C
  18.      dimension A(x,y), B(y,z), C(x,z)
  19.  
  20.      ! Wektory pomocnicze, przy iloczynie skalarnym (3 sposób mnożenia)
  21.      real:: vec_A(y)
  22.      real:: vec_B(y)
  23.  
  24.      ! Wypełniam macierz A i B losowymi wartościami, macierz C zerami.
  25.      do i=1,x
  26.         do j=1,y
  27.             CALL RANDOM_NUMBER(tmp)
  28.             A(i,j)=tmp
  29.         end do
  30.      end do
  31.  
  32.      do i=1,y
  33.         do j=1,z
  34.             CALL RANDOM_NUMBER(tmp)
  35.             B(i,j)=tmp
  36.         end do
  37.      end do
  38.  
  39.      do i=1,x
  40.         do j=1,z
  41.             C(i,j)=0
  42.         end do
  43.      end do
  44.      write(*,*) "Macierz A:"
  45.      print *,A
  46.      write(*,*) "Macierz B:"
  47.      print *,B
  48.      write(*,*) "Macierz C:"
  49.      print *,C
  50.  
  51.      ! Obliczam macierz C pierwszym sposobem: (naive math)
  52.      do i=1,x
  53.         do j=1,y
  54.             do k=1,z
  55.                 C(i,j)=C(i,j)+A(i,k)*B(k,j)
  56.             end do
  57.         end do
  58.      end do
  59.  
  60.      write(*,*) "Macierz C - wynik A x B (naive math):"
  61.      print *,C
  62.      do i=1,x
  63.         do j=1,z
  64.             C(i,j)=0
  65.         end do
  66.      end do
  67.  
  68.      ! Obliczam macierz C drugim sposobem: (better math)
  69.  
  70.      do j=1,y
  71.         do k=1,z
  72.             do i=1,x
  73.                 C(i,j)=C(i,j)+A(i,k)*B(k,j)
  74.             end do
  75.         end do
  76.      end do
  77.  
  78.      write(*,*) "Macierz C - wynik A x B (better math):"
  79.      print *,C
  80.      do i=1,x
  81.         do j=1,z
  82.             C(i,j)=0
  83.         end do
  84.      end do
  85.  
  86.      ! Obliczam macierz C trzecim sposobem: (better math + dot_product)
  87.      
  88.     do k=1,z
  89.         do  i=1,x
  90.             vec_A= A(i,:)
  91.             vec_B=B(:,k)
  92.             C(i,k)=dot_product(vec_A,vec_B)
  93.         end do
  94.     end do
  95.  
  96.      write(*,*) "Macierz C - wynik A x B (better math + dot_product):"
  97.      print *,C
  98.      do i=1,x
  99.         do j=1,z
  100.             C(i,j)=0
  101.         end do
  102.      end do
  103.  
  104.    
  105.      ! Obliczam macierz C czwartym sposobem: (MATMUL)
  106.      C = matmul(A,B)
  107.      write(*,*) "Macierz C - wynik A x B (matmul):"
  108.      print *,C
  109.  
  110.      
  111.  
  112. end program main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement