1

我在做什么

我有很多微小的矩阵(3x3、5x5、3x4 等),其大小在编译时是已知的。直到现在我使用 numpy 来创建这些

A = np.zeros((3,5))

并像使用内存视图一样使用 numpy 数组。现在,我想摆脱这些 numpy 调用,转而使用 C 数组(或类似的非动态分配的快速数组)。我做了以下事情:

cdef double[3][5] A_c
cdef double[:,:] A = A_c
A[:] = 0.0

当然,最后一行取决于将元素设置为零的重要性。对于动态大小的数组,我这样做:

double[:,:] A = view.array(shape=(4, N), itemsize=sizeof(double), format="d")

我对此很满意。

我想做什么

我想用更简洁的方式来做到这一点。我知道为了简洁起见,我可以实现一个像这里描述的类:

Cython:创建没有 NumPy 数组的内存视图?

但这不是在编译时已知大小的 ac 数组。也许有一种方法可以使用带参数的 DEF 宏?像这样:

** NOT WORKING, DO NOT COPY AND PASTE **
DEF small_matrix(name,size):
    cdef double[size[0],size[1]] name_c
    cdef double[:,:] name = name_c

...
small_matrix(A,(3,5))
small_matrix(B,(5,1))
...
small_matrix(C,(3,1))
for i in range(3):
  C[i,0] = 0.0
  for j in range(5):
    C[i,0] += A[i,j]*B[j,0]

也许我还缺少一种简单的方法来创建具有非动态分配数据的向量/矩阵的 cdef 类。

4

0 回答 0