GVKun编程网logo

加快用于计算矩阵辅因子的python代码(矩阵辅助因子)

86

以上就是给各位分享加快用于计算矩阵辅因子的python代码,其中也会对矩阵辅助因子进行解释,同时本文还将给你拓展c–无法执行Cython包装的Python代码、C#中的Python脚本通过C#传递值并

以上就是给各位分享加快用于计算矩阵辅因子的python代码,其中也会对矩阵辅助因子进行解释,同时本文还将给你拓展c – 无法执行Cython包装的Python代码、C#中的Python脚本通过C#传递值并从python代码获取返回值、Python / NumPy中用于计算均值的元素排列、python – 用于计算“多项式系数”的numpy / scipy函数等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

加快用于计算矩阵辅因子的python代码(矩阵辅助因子)

加快用于计算矩阵辅因子的python代码(矩阵辅助因子)

作为复杂任务的一部分,我需要计算矩阵辅因子。我使用此漂亮的代码来计算矩阵未成年人的方式很简单。这是我的代码:

def matrix_cofactor(matrix):    C = np.zeros(matrix.shape)    nrows, ncols = C.shape    for row in xrange(nrows):        for col in xrange(ncols):            minor = matrix[np.array(range(row)+range(row+1,nrows))[:,np.newaxis],                           np.array(range(col)+range(col+1,ncols))]            C[row, col] = (-1)**(row+col) * np.linalg.det(minor)    return C

原来,这个矩阵辅助因子代码是瓶颈,我想优化上面的代码片段。关于如何执行此操作的任何想法?

答案1

小编典典

如果矩阵是可逆的,则辅因子与逆有关:

def matrix_cofactor(matrix):    return np.linalg.inv(matrix).T * np.linalg.det(matrix)

这样可以大大提高速度(对于50x50矩阵,约为1000倍)。主要原因是根本的:这是一种O(n^3)算法,而基于次要成绩的算法是O(n^5)

这也可能意味着对于不可逆矩阵,也有一些聪明的方法可以计算辅因子(即,不使用上面使用的数学公式,而是使用其他等效定义)。


如果您坚持使用基于det的方法,则可以执行以下操作:

大部分时间似乎都在里面度过det。(检查line_profiler可以自己找到。)您可以尝试通过将Numpy与Intel
MKL链接来加快这一部分的速度,但是除此之外,您还可以做很多事情。

您可以像这样加快代码的另一部分:

minor = np.zeros([nrows-1, ncols-1])for row in xrange(nrows):    for col in xrange(ncols):        minor[:row,:col] = matrix[:row,:col]        minor[row:,:col] = matrix[row+1:,:col]        minor[:row,col:] = matrix[:row,col+1:]        minor[row:,col:] = matrix[row+1:,col+1:]        ...

根据矩阵的大小,这将获得大约10-50%的总运行时间。原始代码具有Pythonrange和列表操作,这比直接切片索引慢。您也可以尝试变得更聪明,只复制实际更改的未成年人的部分
—但是,在完成上述更改之后,内部已花费了将近100%的时间,numpy.linalg.det因此无法进一步优化其他部分很有道理

c – 无法执行Cython包装的Python代码

c – 无法执行Cython包装的Python代码

我正在使用Cython导出用于 python代码的C API.该应用程序将在Ubuntu上执行.项目文件存在 here

我正在包装的函数,读取图像的文件名并显示图像. Show_Img.pyx文件如下所示

import cv2

cdef public void Print_image(char* name):
  img = cv2.imread(name)
  cv2.imshow("Image",img)
  while(True):
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break

从Cython生成的c接口如下所示

__PYX_EXTERN_C DL_IMPORT(void) Print_image(char *);

头文件包含在我的algo.cpp中,它调用下面的函数

#include<iostream>
#include<Python.h>
#include"Show_Img.h"
using namespace std;

int main(){
  char *name = "face.jpg"; 
  Py_Initialize();
  Print_image(name);
  Py_Finalize();
  return 0;
}

使用下面的命令,我还可以编译上面的代码并生成应用程序

g++ algo.cpp `pkg-config --libs --cflags python-2.7` `pkg-config --libs --cflags opencv` -L. -lShow_Img -o algo

还正确设置了库LD_LIBRARY_PATH的路径

执行应用程序时,出现错误分段错误(核心转储)

为什么我无法执行应用程序,生成过程中是否存在错误?或图书馆链接?

解决方法

要跟进我的评论,你必须为模块调用init函数:

// ...
Py_Initialize();
initShow_Img(); // for python3 use PyInit_Show_Img instead
Print_image(name);
Py_Finalize();
// ...

原因是这个设置模块,包括执行行导入cv2.没有它,访问模块全局变量(到达cv2)之类的东西将无法可靠地工作.这可能是导致分段错误的原因.

这是在the documentation example.

C#中的Python脚本通过C#传递值并从python代码获取返回值

C#中的Python脚本通过C#传递值并从python代码获取返回值

如何解决C#中的Python脚本通过C#传递值并从python代码获取返回值?

我正在用 C# 制作一个 GUI 并使用铁 python 编写 python 脚本。但我想将 C# 代码中的值传递给 python 代码,并获取返回值以显示在我的 gui 中。可以吗???

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Python / NumPy中用于计算均值的元素排列

Python / NumPy中用于计算均值的元素排列

我有一维列表如下:

data = [1,5,9,13,2,6,10,14,3,7,11,15,4,8,12,16]

我要列出以下元组,并分别计算每个元组的平均值。

[(1,6),(3,8),(9,14),(11,16)]

预期结果应为:

[3.5,5.5,11.5,13.5]

这样做更简单的方法是什么?

python – 用于计算“多项式系数”的numpy / scipy函数

python – 用于计算“多项式系数”的numpy / scipy函数

是否有任何 python函数(可能来自numpy或scipy)计算扩展中x ** r的系数(1 xx ** 2 x ** 3 … x **(k-1))** n,其中k> = 1,n> = 0且0 <= r <= n(k-1)? 这有时被称为多项式系数(PC)(参见,例如,here).

如果没有,你能想到一种有效的计算方法吗? (我对天真/贪婪的方式不感兴趣).

解决方法

你实际上正在进行[1,1,…,1]的n次卷积.
因此,您是否考虑在足够零填充的阵列上使用FFT,将其元素提升到幂n并使用逆FFT来恢复所有系数

(1+x+x**2+x**3+...+x**(k-1))**n

然后只是阅读你感兴趣的那些?

更新:

由于FFT是循环的,因此您需要一个不小于其中的项数的数组

(1+x+x**2+x**3+...+x**(k-1))**n

或者换句话说,(k-1)* n 1使结果不会在末端环绕(或者至少在它们这样做时它们只向受影响的元素添加零).通常它的长度也应该是2的幂,因为这是FFT算法所要求的(实现不需要它将用零填充输入直到它).

在类似C的伪代码中:

unsigned int m = 1;
while(m<(k-1)*n+1) m *= 2;

complex c[m];
for(unsigned int i=0;i!=k;++i) c[i] = complex(1.0,0.0);
for(unsigned int i=k;i!=m;++i) c[i] = complex(0.0,0.0);

c = fft(c);
for(unsigned int i=0;i!=m;++i) c[i] = pow(c[i],double(n));
c = inv_fft(c);

在此结束时,复数组c的第r个元素的实部等于x ** r的系数和零的虚部.
现在,由于这都是以浮点形式完成的,因此您应该知道这些元素将累积舍入错误.您可以通过将它们四舍五入到最接近的整数来部分纠正这一点,但要注意,对于足够大的k和n,这些误差将超过0.5,因此这会产生因某些小的相对误差而关闭的结果.

在网上快速搜索显示,numpy分别具有FFT及其逆,numpy.fft.rfft和numpy.fft.irfft的实现,您可以在输入数据为真时使用.

今天关于加快用于计算矩阵辅因子的python代码矩阵辅助因子的讲解已经结束,谢谢您的阅读,如果想了解更多关于c – 无法执行Cython包装的Python代码、C#中的Python脚本通过C#传递值并从python代码获取返回值、Python / NumPy中用于计算均值的元素排列、python – 用于计算“多项式系数”的numpy / scipy函数的相关知识,请在本站搜索。

本文标签: