【发布时间】:2020-07-17 10:52:58
【问题描述】:
我想用 C 来处理一些计算。比如我有一个添加两个矩阵的C函数:
// mat_add.c
#include <stdlib.h>
void matAdd(int ROW, int COL, int x[][COL], int y[][COL], int z[][COL]){
int i, j;
for (i = 0; i < ROW; i++){
for (j = 0; j < COL; j++){
z[i][j] = x[i][j] + y[j][j];
}
}
}
然后我编译成.so文件:gcc -shared -fPIC mat_add.c -o mat_add.so
在python中:
# mat_add_test.py
import ctypes
import numpy as np
def cfunc(x, y):
nrow, ncol = x.shape
objdll = ctypes.CDLL('./mat_add.so')
func = objdll.matAdd
func.argtypes = [
ctypes.c_int,
ctypes.c_int,
np.ctypeslib.ndpointer(dtype=np.int, ndim=2, shape=(nrow, ncol)),
np.ctypeslib.ndpointer(dtype=np.int, ndim=2, shape=(nrow, ncol)),
np.ctypeslib.ndpointer(dtype=np.int, ndim=2, shape=(nrow, ncol))
]
func_restype = None
z = np.empty_like(x)
func(nrow, ncol, x, y, z)
return z
if __name__ == '__main__':
x = np.array([[1, 2], [3, 4]], dtype=np.int)
y = np.array([[2, 2], [5, 6]], dtype=np.int)
z = cfunc(x, y)
print(z)
print('end')
执行这个python文件,我得到:
$ python mat_add_test.py
[[ 3 4]
[8386863780988286322 7813586346238636153]]
end
返回矩阵的第一行是正确的,但第二行是错误的。我想我没有成功更新z中的值,但我不知道问题出在哪里。
任何人都可以帮忙吗?非常感谢!
【问题讨论】:
-
您在 C 中输入的长度错误。如果我尝试使用声明为
long的数组的代码,它会起作用。可能有一些正确的过程和适当的typedef- 我不建议硬编码long,但它足以证明这一点。 -
除此之外,C:
y[j][j]中的一个小错误应该是y[i][j] -
x.dtype报告dtype('int64') -
我将我的 .c 文件从
int更改为long,它可以工作了!我忘记了 np.int 与 c 中的 int 不同。非常感谢! -
不客气。为了发现问题,我只是将 printf 语句放入 C 代码中 -
printf("i=%d j=%d x=%d y=%d\n", i, j, x[i][j], y[i][j]);写入i=0 j=0 x=1 y=2i=0 j=1 x=0 y=0i=1 j=0 x=2 y=2i=1 j=1 x=0 y=0。那么它就变得相当明显了。