Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Cython lapack不会覆盖参数_Python_C_Cython_Lapack - Fatal编程技术网

Python Cython lapack不会覆盖参数

Python Cython lapack不会覆盖参数,python,c,cython,lapack,Python,C,Cython,Lapack,我正在学习Cython lapack界面。我尝试将一个在C中使用lapack的小示例转换为在Cython中使用Cython_lapack包的小示例 下面是C代码: #include <stdio.h> #include <lapacke.h> int main() { int i, j; float norm; float A[] = {1.44, -7.84, -4.39, 4.53, -9.96, -0.28, -3.24

我正在学习Cython lapack界面。我尝试将一个在C中使用lapack的小示例转换为在Cython中使用Cython_lapack包的小示例

下面是C代码:

#include <stdio.h>
#include <lapacke.h>

int main()
{
  int i, j;
  float norm;
  float A[] = {1.44, -7.84, -4.39, 4.53, 
               -9.96, -0.28, -3.24,  3.83,
               -7.55, 3.24, 6.27, -6.64,
               8.34, 8.09, 5.28, 2.06,
               7.08, 2.52, 0.74, -2.47,
               -5.45, -5.70, -1.19, 4.70};
  float B[] = {8.58, 9.35,
               8.26, -4.43,
               8.48, -0.70,
               -5.28, -0.26,
               5.72, -7.36,
               8.93, -2.52};
  lapack_int m = 6, n = 4, nrhs = 2;
  int info;

  info = LAPACKE_sgels(LAPACK_ROW_MAJOR, 'N', m, n, nrhs, A, n, B, nrhs);
  printf("Least squares solution:\n");
  for (i = 0; i < n; ++i) {
    for (j = 0; j < nrhs; ++j) printf(" %6.2f", B[nrhs * i + j]);
    printf("\n");
  }
  printf("Residual sum of squares for the solution:\n");
  for (i = 0; i < nrhs; ++i) {
    norm = 0.0;
    for (j = n; j < m; ++j) norm += B[nrhs * j + i] * B[nrhs * j + i];
  printf(" %6.2f", norm);
 }
 printf("\n");
 return 0;
}
#包括
#包括
int main()
{
int i,j;
浮动范数;
浮动A[]={1.44,-7.84,-4.39,4.53,
-9.96, -0.28, -3.24,  3.83,
-7.55, 3.24, 6.27, -6.64,
8.34, 8.09, 5.28, 2.06,
7.08, 2.52, 0.74, -2.47,
-5.45, -5.70, -1.19, 4.70};
浮动B[]={8.58,9.35,
8.26, -4.43,
8.48, -0.70,
-5.28, -0.26,
5.72, -7.36,
8.93, -2.52};
lapack_int m=6,n=4,nrhs=2;
国际信息;
info=拉帕克(拉帕克(拉帕克)排大调,'N',m,N,nrhs,A,N,B,nrhs);
printf(“最小二乘解:\n”);
对于(i=0;i
我将其翻译成Cython,如下所示:

import numpy as np
cimport numpy as cnp
from scipy.linalg.cython_lapack cimport dgels

a = np.array([1.44, -9.96, -7.55, 8.34, 7.08, -5.45,
              7.84, -0.28, 3.24, 8.09, 2.52, -5.70,
              -4.39, -3.24, 6.27, 5.28, 0.74, -1.19,
              4.53, 3.83, -6.64, 2.06, -2.47, 4.70], dtype=np.float64)
b = np.array([8.58, 8.26, 8.48, -5.28, 5.72, 8.93,
              9.35, -4.43, -.70, -0.26, -7.36, -2.52], dtype=np.float64)

cdef int m = 6, n = 4, nrhs = 2, lda = 6, ldb = 6, lwork = -1, info = 1
cdef double work = 0.0

cdef double* A = <double*>(cnp.PyArray_DATA(a))
cdef double* B = <double*>(cnp.PyArray_DATA(b))

dgels('N', &m, &n, &nrhs, A, &lda, B, &ldb, &work, &lwork, &info)
print "A:"
for j in range(4):
    for i in range(6):
        print "%6.2f " % A[6*j+i],
    print ""
print "B:"
for j in range(2):
    for i in range(6):
        print "%6.2f " % B[6*j+i],
    print ""
将numpy导入为np
cimport numpy作为cnp
来自scipy.linalg.cython_lapack cimport dgels
a=np.数组([1.44,-9.96,-7.55,8.34,7.08,-5.45,
7.84, -0.28, 3.24, 8.09, 2.52, -5.70,
-4.39, -3.24, 6.27, 5.28, 0.74, -1.19,
4.53,3.83,-6.64,2.06,-2.47,4.70],数据类型=np.64)
b=np.数组([8.58,8.26,8.48,-5.28,5.72,8.93,
9.35,-4.43,-.70,-0.26,-7.36,-2.52],数据类型=np.64)
cdef int m=6,n=4,nrhs=2,lda=6,ldb=6,lwork=1,info=1
cdef双功=0.0
cdef double*A=(cnp.PyArray_DATA(A))
cdef double*B=(cnp.PyArray_数据(B))
DGEL('N'、&m、&N、&nrhs、A、&lda、B、&ldb、&work、&lwork、&info)
打印“A”:
对于范围(4)内的j:
对于范围(6)中的i:
打印“%6.2f”%A[6*j+i],
打印“”
打印“B”:
对于范围(2)内的j:
对于范围(6)中的i:
打印“%6.2f”%B[6*j+i],
打印“”
我希望A和B会被修改,就像C代码中的行为一样。然而,奇怪的是,它们根本没有改变。我想知道我应该做什么才能得到正确的结果

来自

如果LWORK=-1,则假定为工作区查询;例行公事 仅计算工作数组的最佳大小,返回 此值作为工作数组的第一个条目,没有错误 与LWORK相关的信息由XERBLA发布

您没有要求进行计算—您只是要求将工作区数组设置为多大。你也可以

  • 接下来,使用大小合适的工作区数组进行第二次调用,或者
  • 只需根据文档分配一个工作区数组(最好是
    max(1,MN+max(MN,NRHS)*NB)
    ),并将其大小传递为
    LWORK
  • 如果LWORK=-1,则假定为工作区查询;例行公事 仅计算工作数组的最佳大小,返回 此值作为工作数组的第一个条目,没有错误 与LWORK相关的信息由XERBLA发布

    您没有要求进行计算—您只是要求将工作区数组设置为多大。你也可以

  • 接下来,使用大小合适的工作区数组进行第二次调用,或者
  • 只需根据文档分配一个工作区数组(最好是
    max(1,MN+max(MN,NRHS)*NB)
    ),并将其大小传递为
    LWORK

  • 回答得好!非常感谢你!我没有仔细检查文档。@NORTMP如果这个答案解决了您的问题,请接受it@ead对不起,我是个新手,但你接受这个答案是什么意思?回答得好!非常感谢你!我没有仔细检查文档。@NORTMP如果这个答案解决了您的问题,请接受it@ead对不起,我是个新手,但你接受这个答案是什么意思?