update
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
import example
|
||||
example.hello()
|
@@ -0,0 +1,3 @@
|
||||
subroutine hello()
|
||||
print *, "Hello from Fortran!"
|
||||
end subroutine hello
|
@@ -0,0 +1,46 @@
|
||||
import example
|
||||
|
||||
matrix = [[1, 2], [3, 4]]
|
||||
print(example.sum_matrix(matrix))
|
||||
|
||||
print('---')
|
||||
|
||||
# 时间对比
|
||||
|
||||
import numpy as np
|
||||
import time
|
||||
|
||||
matrix = np.random.rand(5000, 5000)
|
||||
|
||||
start = time.time()
|
||||
print(example.sum_matrix(matrix))
|
||||
end = time.time()
|
||||
print('Python + Fortran 循环求和时间:', end - start)
|
||||
|
||||
start = time.time()
|
||||
sum_result = 0
|
||||
for i0 in range(matrix.shape[0]):
|
||||
for j0 in range(matrix.shape[1]):
|
||||
sum_result += matrix[i0, j0]
|
||||
print(sum_result)
|
||||
end = time.time()
|
||||
print('Python 循环求和时间:', end - start)
|
||||
|
||||
from numba import jit
|
||||
@jit
|
||||
def numba_for_sum_matrix(matrix):
|
||||
sum_result = 0
|
||||
for i0 in range(matrix.shape[0]):
|
||||
for j0 in range(matrix.shape[1]):
|
||||
sum_result += matrix[i0, j0]
|
||||
return sum_result
|
||||
|
||||
start = time.time()
|
||||
print(numba_for_sum_matrix(matrix))
|
||||
end = time.time()
|
||||
print('Python numba 循环求和时间:', end - start)
|
||||
|
||||
start = time.time()
|
||||
print(np.sum(matrix))
|
||||
end = time.time()
|
||||
print('Python numpy.sum() 求和时间:', end - start)
|
@@ -0,0 +1,17 @@
|
||||
subroutine sum_matrix(matrix, total)
|
||||
implicit none
|
||||
! 输入参数
|
||||
real, intent(in) :: matrix(:,:) ! 假定形状数组
|
||||
real, intent(out) :: total ! 输出总和
|
||||
|
||||
! 局部变量
|
||||
integer :: i, j
|
||||
|
||||
! 双重循环计算总和
|
||||
total = 0.0
|
||||
do j = 1, size(matrix, 2) ! 获取列数
|
||||
do i = 1, size(matrix, 1) ! 获取行数
|
||||
total = total + matrix(i, j)
|
||||
end do
|
||||
end do
|
||||
end subroutine sum_matrix
|
@@ -0,0 +1,31 @@
|
||||
import numpy as np
|
||||
import example
|
||||
|
||||
A = [[1.0, 2.0, 3.0],
|
||||
[0.0, 1.0, 4.0],
|
||||
[5.0, 6.0, 0.0]]
|
||||
|
||||
Ainv_1 = np.asfortranarray(np.empty_like(A))
|
||||
example.inverse_matrix(A, Ainv_1) # 调用 Fortran 子程序
|
||||
print(Ainv_1)
|
||||
|
||||
Ainv_2 = np.linalg.inv(A)
|
||||
print(Ainv_2)
|
||||
|
||||
print('---')
|
||||
|
||||
# 时间对比
|
||||
|
||||
A = np.random.rand(3000, 3000)
|
||||
|
||||
import time
|
||||
start = time.time()
|
||||
Ainv_1 = np.asfortranarray(np.empty_like(A))
|
||||
example.inverse_matrix(A, Ainv_1) # 调用 Fortran 子程序
|
||||
end = time.time()
|
||||
print('Python + Fortran 求逆时间:', end - start)
|
||||
|
||||
start = time.time()
|
||||
Ainv_2 = np.linalg.inv(A)
|
||||
end = time.time()
|
||||
print('Python np.linalg.inv() 求逆时间:', end - start)
|
@@ -0,0 +1,19 @@
|
||||
! 矩阵求逆子程序
|
||||
subroutine inverse_matrix(A, Ainv)
|
||||
implicit none
|
||||
real(8), intent(in) :: A(:,:) ! 输入矩阵
|
||||
real(8), intent(inout) :: Ainv(:,:) ! 输出逆矩阵
|
||||
real(8), allocatable :: work(:)
|
||||
integer, allocatable :: ipiv(:)
|
||||
integer :: n, info
|
||||
|
||||
n = size(A,1)
|
||||
allocate(ipiv(n), work(n))
|
||||
|
||||
Ainv = A ! 复制输入矩阵
|
||||
|
||||
call dgetrf(n, n, Ainv, n, ipiv, info) ! LU 分解
|
||||
call dgetri(n, Ainv, n, ipiv, work, n, info) ! 计算逆矩阵
|
||||
|
||||
deallocate(ipiv, work)
|
||||
end subroutine inverse_matrix
|
Reference in New Issue
Block a user