- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个奇怪的现象,虽然 scipy.sparse.linalg.eigs
对于稀疏矩阵应该更快,但我知道它运行得比正常的 eigvals
方法慢scipy
:
In [4]: %timeit m.calc_pde_numerical_jacobian(m.initial_state)
10 loops, best of 3: 41.2 ms per loop
In [5]: %timeit m.calc_pde_analytic_jacobian(m.initial_state)
1000 loops, best of 3: 1.42 ms per loop
In [6]: %timeit m.calc_analytic_pde_eigs(m.initial_state)
1 loop, best of 3: 374 ms per loop
In [7]: %timeit m.calc_numeric_pde_eigs(m.initial_state)
1 loop, best of 3: 256 ms per loop
所以方法 calc_pde_numerical_jacobian
构建了我的方程组的 Jacobian 的稠密矩阵,而 calc_pde_analytic_jacobian
正在解析地构建 Jacobian 的稀疏矩阵(csc
格式)。虽然分析方法在构造雅可比行列式的稀疏矩阵方面工作得更快,但是当使用 scipy 的特征值查找方法时,稀疏矩阵特征值方法更慢。我用来计算特征值的函数如下:
def calc_numeric_pde_eigs(self,state):
return linalg.eigvals(self.calc_pde_numerical_jacobian(state))
def calc_analytic_pde_eigs(self,state):
return sparse.linalg.eigs(self.calc_pde_analytic_jacobian(state),k=6,which='LR',return_eigenvectors=False)
有人知道这是怎么发生的吗?
最佳答案
对于足够大和稀疏的矩阵,稀疏求解器应该更快。我针对范围 (150, 550, 50) 和 N = 1000 中的 N 运行了以下代码段:
In [150]: from scipy import sparse
In [151]: from scipy import linalg
[...]
In [186]: N = 150
In [187]: m = sparse.random(N, N, density=0.05).tocsc()
In [188]: a = m.A
In [189]: %timeit sparse.linalg.eigs(m, k=6, which='LR', return_eigenvectors=False)
10 loops, best of 3: 20.2 ms per loop
In [190]: %timeit linalg.eigvals(a)
100 loops, best of 3: 9.66 ms per loop
并得到以下时间(以毫秒为单位):
N 150 200 250 300 350 400 450 500 1000
sparse.linalg.eig 20.2 22.2 28.9 29.4 48.5 38.6 75.2 57.9 152
linalg.eigvals 9.7 17.0 24.5 37.0 52.7 63.3 82.5 105 482
在这种情况下,稀疏求解器具有竞争力的大小为 250-300。
时间可能取决于稀疏性(即矩阵的非零百分比)和非零元素的结构或模式。对于您的问题,在矩阵大于 512x512 之前,稀疏求解器可能不会更好。
关于python - 稀疏特征值 : scipy. sparse.linalg.eigs 比 scipy.linalg.eigvals 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42954362/
我对 CBMutableCharacteristic 的特征值可以有多长感到困惑。如果我有一个归档对象数组,我可以将特征值设置为这个归档数组吗?或者我最好为数组中的每个归档对象设置一个单独的特征? 最
我在 Python Sympy 中使用来计算带有变量的矩阵 A 的特征值(例如)。有谁知道如何计算这样的矩阵的特征值?命令 A.eigenvals() 不起作用。例如下面的代码: x = symbol
我正在计算协方差矩阵的特征值,它是实数且对称的半正定矩阵。因此,特征值和特征向量都应该是实数,然而numpy.linalg.eig()返回具有(几乎)零虚部的复数值。 协方差矩阵太大,这里贴不出来,但
我正在尝试对图像使用光谱聚类。我首先计算亲和性矩阵,然后尝试获取特征向量。但是,在 7056x7056 矩阵上,eig() 调用花费的时间太长。关于如何改进这个的任何建议?也许我应该使用不同形式的亲和
我目前正在使用 Dart/Flutter BLE 插件来更好地了解 BLE 设备。 插件: https://pub.dartlang.org/packages/flutter_blue 当我连接到我的
我在使用 Eigen 库时遇到错误,我想做的就是从 Eigen::VectorXf 中减去一个标量。所以,我的代码如下: #define VECTOR_TYPE Eigen::VectorXf #de
假设我有一个对称矩阵 M,它不是正(半)定的,我想计算它的 k 顶(绝对值)特征值(和相应的特征向量)。现在,可以使用截断的 SVD 来做到这一点,它将返回所述特征值的绝对值,然后必须检查符号并找到相
我有一个关于 split 节点的问题。我有 4 个特征,想要预测这个人是否会玩,可能会玩,也可能不会玩。根据信息增益,我将“天气”作为第一个要分割的特征,其中“多雨”、“炎热”和“潮湿”作为分支。下雨
我有一个 ~3000x3000 类似协方差的矩阵,我在该矩阵上计算特征值-特征向量分解(它是一个 OpenCV 矩阵,我使用 cv::eigen() 来完成工作)。 但是,我实际上只需要前 30 个特
我想计算 K*es,其中 K 是一个 Eigen 矩阵(维度 pxp)和 es 是一个 px1 随机二进制 vector ,值为 1。 例如,如果 p=5 和 t=2 一个可能的 es 是 [1,0,
我正在尝试使用 CoreBluetooth 框架从设备读取所有可用服务及其特征值。 - (void)centralManager:(CBCentralManager *)central didDisc
我已经在 Internet 上多次看到这个主题,但从未见过一个完整、全面的解决方案,它可以适用于当前库版本的 sklearn 的所有用例。有人可以尝试使用以下示例解释如何实现吗? In this ex
我的输入 数据框(缩短)如下所示: >>> import numpy as np >>> import pandas as pd >>> df_in = pd.DataFrame([[1, 2, 'a
我想读取低功耗蓝牙(智能)的特征值。我不想使用 gatttool 或 btgatt-client。 d-bus 也没有帮助。我想在 Python 中执行此操作。我在以下内容中找不到任何示例: http
我是一名优秀的程序员,十分优秀!