一些背景知识(可能与问题没有直接关系):我需要使用已知的稀疏度执行有效的矩阵乘法。
因为它是稀疏的,所以使用标准矩阵乘法是浪费的,而且因为它是已知的稀疏性,所以我可以用一种有效的方法来实现它,而不是使用稀疏库。你知道吗
我在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
,以避免不必要的拷贝,但最好确保不需要拷贝,而不是依赖它。你知道吗相关问题 更多 >
编程相关推荐