我想使用 lapack 并为其制作 C++ 矩阵包装器,但 lapack 是用 Fortran 编写的,有一些 clapack 但我想从源代码使用它。首先将 *.f 和 *.cpp 文件编译为目标文件,然后将其链接到应用程序中。
我拥有以下应用程序和来源。
我该如何申请,请帮忙...
我的操作系统是 Windows 7 和 CPU Core2Duo,并且我没有 Intel 数学内核
我正在使用 numpy.svd 来计算条件不良矩阵的奇异值分解。对于某些特殊情况,svd 不会收敛并引发 Linalg.Error。我做了一些研究,发现 numpy 使用 LAPACK 中的 DGEESDD 例程。标准实现的硬编码迭代限制为 35 次或更多迭代。如果我尝试在 Matlab 中分解相同的矩阵,一切都会正常,我认为有两个原因: 1. Matlab 使用 DGESVD 而不是 DGEESDD,后者通常看起来更稳健。2. Matlab 在例程中使用 75 次迭代限制。(他们在源代码中更改了它并重新编译了它。)
现在的问题是:是否有一种简单的方法可以将 numpy 中使用的后端从 DGEESDD 更改为 DGESVD,而无需修改 numpy 源?
预先感谢米莎
我想执行一串矩阵乘法,如果可以避免的话,我宁愿不分配新的矩阵。例如,我想计算 C = C * B (所以我将 C 作为A和传递C)
我可以这样做吗(因为dgemm将A和 都标记B为in变量)?
我对犰狳的使用有疑问.
我正在使用Ubuntu 12.10,以及Code :: Blocks中的gcc编译器.我使用synaptic包管理器安装了LAPACK和BLAS.我还使用突触包管理器安装了一次Armadillo,一次是用CMake手动安装的.CMake在进行犰狳编译的配置时找到了LAPACK和BLAS库.此外,我在"构建选项" - >"链接器"中的代码::块中链接了BLAS和LAPACK的库.
但是,每当我想构建我的项目时,我都会收到错误消息:
In function `void arma::lapack::getrf<double>(int*, int*, double*, int*, int*, int*)':|
/usr/include/armadillo_bits/lapack_wrapper.hpp|41|undefined reference to `wrapper_dgetrf_'|
Run Code Online (Sandbox Code Playgroud)
这显然意味着犰狳找不到LAPACK,但我做错了什么?
我还取消了armadillo_bits/config.hpp文件中各自的行,因此它看起来像这样:
#if !defined(ARMA_USE_LAPACK)
//#define ARMA_USE_LAPACK
//// Uncomment the above line if you have LAPACK or a high-speed replacement for LAPACK,
//// such as Intel MKL, AMD ACML, or the Accelerate framework.
//// LAPACK is required for matrix decompositions (eg. SVD) and matrix inverse.
#endif
#if !defined(ARMA_USE_BLAS)
//#define ARMA_USE_BLAS
//// Uncomment the above line if you have BLAS or …Run Code Online (Sandbox Code Playgroud) 我已经从 Ubuntu 中的 Synaptic 包管理器安装了 LAPACK 和 BLAS。
whereis libblas
libblas: /usr/lib/libblas.so /usr/lib/libblas.a /usr/lib/libblas
whereis liblapack
liblapack: /usr/lib/liblapack.a /usr/lib/liblapack.so
Run Code Online (Sandbox Code Playgroud)
当我尝试编译randomsys1 示例时,gfortran我收到以下错误消息。
gfortran randomsys1.f90 -L/usr/lib/lapack -llapack -L/usr/lib/libblas -lblas
/tmp/cclwtifh.o: In function `MAIN__':
randomsys1.f90:(.text+0x12): undefined reference to `init_random_seed_'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
或者
gfortran randomsys1.f90 -llapack -lblas
/tmp/ccB1isEC.o: In function `MAIN__':
randomsys1.f90:(.text+0x12): undefined reference to `init_random_seed_'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这是gfortran与lapackand链接的推荐方式blas(请参考gfortran LAPACK “undefined reference” error …
有两个维度为 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 …
每次调用 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) 假设我们对依赖于参数 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) 我有两个大小为 (2500, 208) 和 (208, 2500) 的密集矩阵。我想计算他们的产品。当它是单个进程时,它运行良好且快速,但当它处于多处理块中时,进程会在那里停留数小时。我做更大尺寸的稀疏矩阵乘法,但我没有问题。我的代码如下所示:
with Pool(processes=agents) as pool:
result = pool.starmap(run_func, args)
def run_func(args):
#Do stuff. Including large sparse matrices multiplication.
C = np.matmul(A,B) # or A.dot(B) or even using BLASS library directly dgemm(1, A, B)
#Never go after the line above!
Run Code Online (Sandbox Code Playgroud)
请注意,当该函数run_func在单个进程中执行时,它可以正常工作。当我在本地机器上进行多处理时,它工作正常。当我在 HPC 上进行多处理时,它卡住了。我这样分配我的资源:
srun -v --nodes=1 --time 7-0:0 --cpus-per-task=2 --nodes=1 --mem-per-cpu=20G python3 -u run.py 2
其中最后一个参数是agents上面代码中的数字。这是 HPC 上支持的 LAPACK 库详细信息(从 numpy 获得):
libraries = ['mkl_rt', 'pthread']
library_dirs = ['**/lib']
define_macros = …Run Code Online (Sandbox Code Playgroud)