我試圖通過(guò)在 C++ 中實(shí)現(xiàn)一個(gè)函數(shù)并使用 CFFI 將其嵌入到我的代碼中來(lái)加速我的 Python 程序。該函數(shù)采用兩個(gè) 3x3 數(shù)組并計(jì)算距離。Python代碼如下:import cffiimport numpy as npffi = cffi.FFI()ffi.cdef(""" extern double dist(const double s[3][3], const double t[3][3]);""")lib = ffi.dlopen("./dist.so")S = np.array([[-1.63538, 0.379116, -1.16372],[-1.63538, 0.378137, -1.16366 ],[-1.63193, 0.379116, -1.16366]], dtype=np.float32)T = np.array([[-1.6467834, 0.3749715, -1.1484985],[-1.6623441, 0.37410975, -1.1647063 ],[-1.6602284, 0.37400728, -1.1496595 ]], dtype=np.float32)Sp = ffi.cast("double(*) [3]", S.ctypes.data)Tp = ffi.cast("double(*) [3]", T.ctypes.data)dd = lib.dist(Sp,Tp);該解決方案無(wú)法按預(yù)期工作。事實(shí)上,C 函數(shù)打印的參數(shù)是: Sp=[[0.000002, -0.270760, -0.020458] [0.000002, 0.000000, 0.000000] [0.000000, 0.000000, 0.000000]] Tp=[[0.000002, -0.324688, -0.020588] [0.000002, 0.000000, 0.000000] [0.000000, 0.000000, -nan]]我還嘗試了以下方法來(lái)初始化指針:Sp = ffi.new("double *[3]")for i in range(3): Sp[i] = ffi.cast("double *", S[i].ctypes.data)Tp = ffi.new("double *[3]")for i in range(3): Tp[i] = ffi.cast("double *", T[i].ctypes.data)dd = lib.dist(Sp,Tp);但這個(gè)解決方案會(huì)出現(xiàn)錯(cuò)誤dist(Sp,Tp):TypeError: initializer for ctype 'double(*)[3]' must be a pointer to same type, not cdata 'double *[3]'您知道如何使其發(fā)揮作用嗎?謝謝。
1 回答

江戶(hù)川亂折騰
TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
類(lèi)型double[3][3]
和double *[3]
不等效。前者是一個(gè) double 3x3 的 2D 數(shù)組,存儲(chǔ)為 9 個(gè)連續(xù)的 double。后者是一個(gè)由 3 個(gè)雙指針組成的數(shù)組,這不是 C 或 C++ 中 2D 靜態(tài)數(shù)組的實(shí)現(xiàn)方式。
numpy 數(shù)組和 C++ 靜態(tài)數(shù)組在內(nèi)存中都表示為連續(xù)的元素塊,只是double *[3]
中間的類(lèi)型給工作帶來(lái)了麻煩。您想要的是使用double[3][3]
正確的 or double[3]*
(指向一行三個(gè)雙精度數(shù)的指針)。請(qǐng)注意,如果您使用后者,您可能需要將函數(shù)原型更改為 take double [][3]
。
添加回答
舉報(bào)
0/150
提交
取消