使用cType调用指针函数的C++函数

2024-04-19 16:01:49 发布

您现在位置:Python中文网/ 问答频道 /正文

一些背景知识(可能与问题没有直接关系):我需要使用已知的稀疏度执行有效的矩阵乘法。
因为它是稀疏的,所以使用标准矩阵乘法是浪费的,而且因为它是已知的稀疏性,所以我可以用一种有效的方法来实现它,而不是使用稀疏库。你知道吗

我在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上的数据(这个函数将用于高维矩阵)。那我怎么解决呢?你知道吗

谢谢。你知道吗


Tags: datasizeasnp矩阵outctypesint
1条回答
网友
1楼 · 发布于 2024-04-19 16:01:49

astype创建数组的副本。因此,out.astype(np.float64)参数提供了一个到sparse_precision_mult的副本,该副本被修改后丢弃。原始out未被修改。你知道吗

创建类型为np.float64out,并在函数调用后转换(如果需要)。你知道吗

如果可能的话,您应该使用函数调用最初需要的类型创建所有参数,以避免被astype复制。你知道吗

astype有一个参数copy,可以将其设置为False,以避免不必要的拷贝,但最好确保不需要拷贝,而不是依赖它。你知道吗

相关问题 更多 >