第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何使用 CFFI 將多維 Numpy 數(shù)組傳遞給 C 函數(shù)?

如何使用 CFFI 將多維 Numpy 數(shù)組傳遞給 C 函數(shù)?

慕桂英546537 2023-12-20 19:59:22
我試圖通過(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]。


查看完整回答
反對(duì) 回復(fù) 2023-12-20
  • 1 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)