【发布时间】:2016-10-30 16:33:11
【问题描述】:
我有一组线性方程,其中 A x = b 并且 A 是一个大矩阵,并且 b 也是已知的。 矩阵A是用python设置的。 现在我想反转矩阵A得到x。
A 和 b 通过共享对象传递给 Fortran 90 程序。我使用 numpy.f2py 编译了 Fortran 程序:
import numpy.f2py.f2py2e as f2py2e
import sys, os
sys.argv += "-lmkl_rt -c -m MKL_MODULE MKL_WRAPPER.f90".split()
f2py2e.main()
最后,我调用了 f90 子程序:
MKL_MODULE.mkl_wrapper.call_dgelsd(A, b, np.shape(A)[0], np.shape(A)[1])
调用 fortran 程序时,内存使用量加倍,显然是由于矩阵 A 和 b 的内部副本。 但是,一旦我有了向量 x,我就不再对 A 或 b 感兴趣了。 有什么办法可以避免内部复制并将 A 传递给 fortran 程序?
我已经有了将 A 和 b 保存到 HD 并从 Fortran 程序中读取它的想法,但这需要很长时间,并且对于我正在处理的大小的矩阵来说并不是一个真正的选择。
【问题讨论】:
-
原始数组
F是否有序? -
不,它的 C 排序。但是转换成Forder应该没问题。
-
从C订单转换为F订单需要副本
-
确实如此。我考虑过立即按 F 顺序设置数组。
标签: python numpy shared-objects f2py