使用 ctypes 通过指针参数调用C++函数
Using ctypes to call C++ function with pointer args
一些背景(可能与问题没有直接关系):我需要在已知的稀疏性下执行有效的矩阵乘法。
因为它是稀疏的,所以使用普通的矩阵乘法是浪费的,并且因为它是已知的稀疏性,所以我可以用有效的方式实现它,而不是使用稀疏库。
我已经在C++中实现了我的功能
void SparsePrecisionMult(double *Q, double *X, double *out, const int dim, const int markov, const int n);
这是"包装器":
import ctypes
_SPMlib = ctypes.CDLL('./SparsePrecisionMult.so')
_SPMlib.SparsePrecisionMult.argtypes = (ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double),
ctypes.c_int, ctypes.c_int, ctypes.c_int)
def sparse_precision_mult(Q, X, out, markov_blanket_size):
global _SPM
m, d = X.shape
_SPMlib.SparsePrecisionMult(Q.ctypes.data_as(ctypes.POINTER(ctypes.c_double)),
X.T.ctypes.data_as(ctypes.POINTER(ctypes.c_double)),
out.ctypes.data_as(ctypes.POINTER(ctypes.c_double)),
d, markov_blanket_size, m)
这就是我所说的:
patch_size = 3
markov_blanket = 3
C = np.eye(9)
X = np.array(range(0, 27, 1)).reshape(3, 9)
out = np.zeros([3, 9])
sparse_precision_mult(C.astype(np.float64), X.astype(np.float64), out.astype(np.float64), 3)
print(out)
此测试应导致 out=X。
用 C 编写的此测试版本表现良好。
我出去=零。所以我的猜测是,不知何故,内存没有被共享和复制。
我不希望我的 RAM 上有重复的数据(此功能将用于高维矩阵)。那么我该如何解决呢?
谢谢。
astype
创建一个数组的副本。因此,out.astype(np.float64)
参数会给sparse_precision_mult
一个副本,该副本被修改然后丢弃。不会修改原始out
。
使用类型 np.float64
创建out
,并(如有必要)在函数调用后转换。
如果可能,您应该使用函数调用所需的类型创建所有参数,以避免astype
复制。
astype
有一个参数copy
可以设置为False
以避免不必要的副本,但最好确保需要/不需要副本,而不是依赖它。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用