我想 Cythonizepyx
脚本的一部分,其中涉及使用复数的 numpy 数组。python 脚本的相关部分如下所示:
M = np.dot(N , Q)
在我的工作中N
,Q
和M
是带有复数条目的 numpy 数组。
具体来说,我想将矩阵转移到代码中并N
在.Q
C++
C++
虽然我知道使用指向C++
脚本的指针传输实值 numpy 数组的方法,然后使用 cython,但我对如何处理具有复杂值的 numpy 数组感到有些困惑。
这就是我试图将数组从现在转移pyx
到C++
现在的方式。
import numpy as np
cimport numpy as np
cdef extern from "./matmult.h" nogil:
void mult(double* M, double* N, double* Q)
def sim():
cdef:
np.ndarray[np.complex128_t,ndim=2] N = np.zeros(( 2 , 2 ), dtype=np.float64)
np.ndarray[np.complex128_t,ndim=2] Q = np.zeros(( 2 , 2 ), dtype=np.float64)
np.ndarray[np.complex128_t,ndim=2] M = np.zeros(( 2 , 2 ), dtype=np.float64)
N = np.array([[1.1 + 2j,2.2],[3.3,4.4]])
Q = np.array([[3.3,4.4+5j],[5.5,6.6]])
mult(&M[0,0], &N[0,0], &Q[0,0])
print M
这是我的 C++ 代码:
#include "matmult.h"
using namespace std;
int main(){}
void mult(double *M, double *N, double *Q)
{
double P[2][2], A[2][2], B[2][2];
for (int i=0; i<2; i++)
{
for (int j=0; j<2; j++)
{
A[i][j] = *( N + ((2*i) + j) );
B[i][j] = *( Q + ((2*i) + j) );
P[i][j] = 0;
}
}
for (int i=0; i<2; i++)
{
for (int j=0; j<2; j++)
{
for (int k=0; k<2; k++)
{
P[i][j] += A[i][k]*B[k][i];
}
}
}
for (int i=0; i<2; i++)
{
for (int j=0; j<2; j++)
{
*( M + ((2*i) + j) ) = P[i][j];
}
}
}
当我使用 cython 编译它时,出现以下错误
mat.pyx:17:27: Cannot assign type 'double complex *' to 'double *'
我会很感激在这里得到一些帮助。