我使用以下链接使用 openblas 编译 Ipopt:./configure --with-blas-incdir="-L/home/moritz/build/CoinIpopt_test/ThirdParty/openblas/include/" --with-blas-lib="-L/home/moritz/build/CoinIpopt_test/ThirdParty/openblas/lib/ -libopenblas_sandybridgep-r0.2.14.a"
如果我没有定义任何特定的 LAPACK 库,Ipopt 会自动使用 netlib 中的 LAPACK。openplas 是否有自己优化的 LAPACK 实现?
如果我使用--with-lapack-incdir="-L/home/moritz/build/CoinIpopt_test/ThirdParty/openblas/include/" --with-lapack-lib="-L/home/moritz/build/CoinIpopt_test/ThirdParty/openblas/lib/"
make 失败,因为无法解析某些 Lapack 例程,例如undefined reference todpotrs_
At least there is the filelapacke.h in theinclude folder but there are not LAPACK libraries in thelib` 文件夹。
我在 GitHub 上发现了这个问题:
好的,我想我想通了...您可以通过在 make 命令行上指定 NO_LAPACK=1 来构建 OpenBLAS,而不包含 LAPACK。默认情况下,它包含完整的 LAPACK 库(某些部分已优化)。
但如果是这种情况,库在哪里?
我应该针对 openblas 编译 LAPACK 吗?
如果有人能够阐明这个问题,我将不胜感激。
我正在用 C++ 开发一个基于线性代数的工具,允许用户链接到不同操作系统上的 OpenBLAS/ATLAS/Intel MKL。这在 Windows 和 Linux 上都很好,但我更愿意允许 OS X 用户也链接到 Accelerate Framework。但是,我的代码使用LAPACKE,它是 LAPACK 的 C 接口(例如,函数是 LAPACKE_fxname ),它似乎不是 Accelerate Framework 的一部分。相反,它具有 CLAPACK f2c'd 函数(例如函数是 fxname_),它们具有不同的接口并使用列主存储。
由于我的其余代码适用于行优先,因此我不想将矩阵转换为列优先,以便我可以在 OS X 上使用 CLAPACK,但这是我唯一的选择吗?也就是说,用LAPACKE开发跨平台软件时,有没有办法使用Accelerate Framework呢?或者有什么技巧可以用来在行主数组上使用 CLAPACK 函数(也许只是传递“转置”标志来进行“不转置”操作?在我看来,行主矩阵以相同的方式存储作为转置的列顺序矩阵。)?
有两个维度为 2 的复杂数组,我想计算一个逐点乘法(Hadamard 乘积):
complex(8) :: A(N,N), B(N,N), C(N,N)
...
do j = 1, N
do i = 1, N
C(i,j) = A(i,j)*B(i,j)
enddo
enddo
Run Code Online (Sandbox Code Playgroud)
是否有任何 BLAS 例程来优化它,或者这实际上已经是编写 Hadamard 产品的最有效方法?或者在这种简单的情况下,编译器是否为我完成了这项工作?
我用 Fortran 编码,所以第一个索引是快速索引。
我有一个y = Ax + b形式的方程组,其中y,x和b是n×1向量,A是×n(对称)矩阵.
所以这里是皱纹.并非所有的x都是未知的.指定了某些x行,并且y的相应行未知.以下是一个例子
| 10 | | 5 -2 1 | | * | | -1 |
| * | = | -2 2 0 | | 1 | + | 1 |
| 1 | | 1 0 1 | | * | | 2 |
Run Code Online (Sandbox Code Playgroud)
其中,*指定未知数.
我已经为Fortran中的上述问题构建了一个求解器,但是我想知道是否有一个不错的鲁棒求解器作为Lapack或MLK的一部分用于这些类型的问题?
我的求解器基于一个排序矩阵,称为根据已知和未知pivot = [1,3,2]重新排列x …
我在将 lapack 链接到 fortran 示例程序时遇到问题。这是程序示例.f95
Program LinearEquations
! solving the matrix equation A*x=b using LAPACK
Implicit none
! declarations
double precision :: A(3,3), b(3)
integer :: i, pivot(3), ok
! matrix A
A(1,:)=(/3, 1, 3/)
A(2,:)=(/1, 5, 9/)
A(3,:)=(/2, 6, 5/)
! vector b
b(:)=(/-1, 3, -3/)
!b(:)=(/2, 2, 9/)
! find the solution using the LAPACK routine DGESV
call DGESV(3, 1, A, 3, pivot, b, 3, ok)
! print the solution x
do i=1, 3
write(*,9) i, b(i)
end …Run Code Online (Sandbox Code Playgroud) 目前,有:
然而,这些是 C 接口。
显然,您可以在 C++ 代码中使用它们,但您无法获得这些接口是为 C++ 设计的所有好处。所以我的问题是: 原生 C++ 中是否存在这样的接口?
每次调用 R 都会创建 63 个子进程
Rscript --vanilla -e 'Sys.sleep(5)' & pstree -p $! | grep -c '{R}'
# 63
Run Code Online (Sandbox Code Playgroud)
哪里pstree看起来像这样
R(2562809)???{R}(2562818)
??{R}(2562819)
...
??{R}(2562878)
??{R}(2562879)
??{R}(2562880)
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?
这是一台带有 debian 9.3、R 3.4.3、blas 3.7.0 和 openmp 2.0.2 的 72 核机器
dpkg-query -l '*blas*' 'r-base' '*lapack*' '*openmp*'|grep ^ii
ii libblas-common 3.7.0-2 amd64 Dependency package for all BLAS implementations
ii libblas-dev 3.7.0-2 amd64 Basic Linear Algebra Subroutines 3, static library
ii libblas3 3.7.0-2 amd64 Basic Linear Algebra Reference implementations, shared library
ii …Run Code Online (Sandbox Code Playgroud) I\xe2\x80\x99m 需要一种有效的方法来反转 python 中的 7000x7000 空气动力学影响系数(密集)矩阵。在使用 FORTRAN 例程之前,我已经开始使用 LAPACK 中的 LU 分解例程来处理问题,我已经看到它在其他相关应用程序中的使用非常有效。不过,我读到 NumPy 和 SciPy 线性系统求解器大多基于对 C 中相同 LAPACK/BLAS 函数的直接调用,并且想知道切换到 FORTRAN 是否真的会在一定程度上减少计算时间这证明放弃一种更简单、更高级的语言是合理的。
\n\n如果有 Python 求解器可以保证该大小(1000 到 10000,平方)的矩阵具有相似的性能,那么它们是哪些?
\n\n我确实需要矩阵逆,所以切换到迭代 Ax=b 解决方案不是一个选择。
\n假设我们对依赖于参数 t 的厄密矩阵 h(t) 的特征值和特征向量感兴趣。我的矩阵又大又稀疏,因此需要进行数值处理。
一种简单的方法是在离散化参数值 t_k 处评估矩阵 h(t_k)。是否可以根据“特征向量的特征”对特征向量和特征值进行排序?
让我用下面的简单例子来说明我所说的“特征向量的特征”是什么意思(i 表示虚数单位)。
h(t) = {{1, i t}, {-i t, 1}}
特征值为 1-t 和 1+t,具有相应的特征向量 {-i, 1} 和 {i, 1}。因此,根据“特征向量特征”进行排序,特征值应该在 t = 0 处交叉。然而,大多数特征求解器通过增加特征值来对它们进行排序,将特征向量从负交换为正 t(参见代码和输出图)。
import numpy as np
import scipy.sparse.linalg as sla
import matplotlib.pyplot as plt
def h(t):
# parametrized hermitian matrix
return np.array([[1, t*1j], [-t*1j, 1]])
def eigenvalues(t):
# convert to tuple for np.vectorize to work
return tuple(sla.eigsh(h(t), k=2, return_eigenvectors=False))
eigenvalues = np.vectorize(eigenvalues)
t = np.linspace(-1, 1, num=200) …Run Code Online (Sandbox Code Playgroud)