Advertisement
Guest User

Solving many small systems

a guest
Nov 18th, 2012
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function pixsolve(A, b) result(x)
  2.     implicit none
  3.     real*8    :: A(:,:,:), b(:,:), x(size(b,1),size(b,2))
  4.     integer*4 :: i, n, m, piv(size(b,2)), err
  5.     n = size(A,1)
  6.     m = size(A,2)
  7.     x = b
  8.     do i = 1, n
  9.         call dgesv(m, 1, A(i,:,:), m, piv, x(i,:), m, err)
  10.     end do
  11. end function
  12.  
  13.  
  14. ! f2py -c -m foo{,.f90} -llapack -lblas
  15. ! python
  16. ! >>> import numpy as np
  17. ! >>> from foo import pixsolve
  18. ! >>> n = 6
  19. ! >>> A = np.random.rand(n, 3, 3)
  20. ! >>> b = np.random.rand(n, 3)
  21. ! >>> x = pixsolve(A, b)  # slightly faster (5%) if A, b are in Fortran order
  22. ! >>> max(np.linalg.norm(np.dot(A[i], x[i]) - b[i]) for i in xrange(n))
  23. ! 2.603703785810335e-16
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement