我正在用C++编写一个使用CLAPACK ATLAS库的程序.但是,我无法让程序成功链接到库.我写了一个小C程序来更好地演示这个问题.有趣的是,如果我用GCC编译它,这个小的演示程序链接就好了,但是当我尝试用G ++编译时,我得到了相同的链接器错误.我希望有人可以帮我弄清楚G ++和GCC究竟在做什么,以便将原始程序链接起来(原始程序是一个C++程序,我不能只是"使用GCC")
这是一个小型演示程序:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <cblas.h>
#include <clapack.h>
// a is a column-major array of all the values in the matrix to invert
// The matrix's height and width are the same because it is a square matrix.
void invertMatrix(float *a, unsigned int height)
{
int info, ipiv[height];
info = clapack_sgetrf(CblasColMajor, height, height, a, height, ipiv);
info = clapack_sgetri(CblasColMajor, height, a, height, ipiv);
}
void displayMatrix(float *a, unsigned int height, unsigned int width) …Run Code Online (Sandbox Code Playgroud) 根据我的理解,需要分解/分解(LU,QR,Cholesky等),然后基于分解进行矩阵逆计算.有没有其他方法可以绕过它(我想弄清楚我是否可以坚持在试用版CULAtools中免费提供的6个功能)?提前感谢您的评论.
我试图用C++中的QR因子分解矩阵 ,使用Lapack函数来求解线性方程组(Ax = b)
据我所知,dgeqrf计算QR分解并覆盖输入矩阵.输出显然包含L(上三角形)的值,但我如何获得Q?
我试过dormqr,据说从dgeqrf的输出计算Q ,但结果与前一次调用的矩阵相同.
这是我的完整代码:
boost::numeric::ublas::matrix<double> in_A(4, 3);
in_A(0, 0) = 1.0;
in_A(0, 1) = 2.0;
in_A(0, 2) = 3.0;
in_A(1, 1) = -3.0;
in_A(1, 2) = 2.0;
in_A(1, 3) = 1.0;
in_A(2, 1) = 2.0;
in_A(2, 2) = 0.0;
in_A(2, 3) = -1.0;
in_A(3, 1) = 3.0;
in_A(3, 2) = -1.0;
in_A(3, 3) = 2.0;
boost::numeric::ublas::vector<double> in_b(4);
in_b(0) = 2;
in_b(1) = 4;
in_b(2) = 6; …Run Code Online (Sandbox Code Playgroud) 我在使用CMake 2.8.9构建的C++代码中使用了blas/lapack.我想用CMake命令找到BLAS和LAPACK库:
find_package(BLAS REQUIRED)
find_package(LAPACK REQUIRED)
Run Code Online (Sandbox Code Playgroud)
但它可以找到它,因为库位于特定目录中.错误如下:
CMake Error at /softs/cmake/2.8.9/64/gcc/4.7.2/share/cmake-2.8/Modules/FindBLAS.cmake:594 (message):
A required library with BLAS API not found. Please specify library
Run Code Online (Sandbox Code Playgroud)
我的问题:我如何指定一个额外的路径来帮助FindBLAS工作,就像我为Boost做的那样(见下文)?
set(PATH_BOOST "/softs/boost/1.53.0/${ARCH}/${COMPILER_NAME}/${COMPILER_VERSION}")
set(BOOST_INCLUDEDIR "${PATH_BOOST}/include")
set(BOOST_LIBRARYDIR "${PATH_BOOST}/lib")
set(Boost_USE_MULTITHREAD ON)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost 1.53.0 REQUIRED COMPONENTS thread system)
Run Code Online (Sandbox Code Playgroud) 根据MATLAB的文档:
[
V,D] = eig(A,B)返回D广义特征值的对角矩阵和全矩阵,V其列是相应的右特征向量,因此A*V = B*V*D.
当我阅读可用的源代码时(似乎所有我已经看过Octave,R,Scipy的实现)导致LAPACK的DGGEV例程,这是JavaScript无法提供的.
兔子洞包括使用Emscripten和Fortran:LAPACK绑定并学习足够的Fortran和线性代数来自己完成.
有人知道更容易获得的东西吗?
我已经在我的笔记本电脑上正确安装了 lapack 和 blas,我可以通过使用链接
-L/usr/lib64 -lblas -llapack
Run Code Online (Sandbox Code Playgroud)
在我的 Makefile 中。
我想使用 cmake 创建一个 Makefile 并链接 lapack 和 blas,我在 /usr/share/cmake/Modules/ 中使用 cmake 提供的 FindLAPACK.cmake 和 FindBLAS.cmake
CMakeLists.txt 是使用:
find_package(BLAS)
find_package(LAPACK)
if(LAPACK_FOUND AND BLAS_FOUND)
set(lapackblas_libraries "${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}")
endif()
target_link_libraries(code_exe ${lapackblas_libraries})
Run Code Online (Sandbox Code Playgroud)
这code_exe是我链接 lapack 和 blas 库的可执行文件,出现错误
make[2]: *** No rule to make target `/usr/lib64/libblas.so /usr/lib64/liblapack.so', needed by `test/tensortest'. Stop.
make[1]: *** [test/CMakeFiles/tensortest.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我吗?非常感谢。
我必须在非方阵上计算SVD.我正在使用LAPACK的dgesvd_例程.我对方形矩阵没有任何问题,与MATLAB相比,我得到了预期的值.但我无法为4x5矩阵产生预期的结果.我知道解决方案应该与MATLAB的解决方案匹配,因为返回的奇异值按降序排序.我可以看到,在SVD的原始A输入数组中可以找到一些奇异值.这表明我必须调用dgesvd_错误或我错误地引用结果,这可能与前导数组维度有关.
在每种情况下,我首先发出一个LWORK = -1的调用,查询LAPACK以获得最佳值,然后输入下一个计算SVD的调用.我不确定返回值的所有含义以及它们是否有效,是否应该更改等等.我认为它们没问题,所以我在后续调用中使用它们来计算SVD.
所以这段代码按预期工作(3x3矩阵):
41 /* Reference data. */
42 double ref_array_A[3][3] = {
43 { 1, 2, 3},
44 { 2, 4, 5 },
45 { 3, 5, 6 }
46 };
47
48 double ref_array_U[3][3] = {
49 { -0.327985, -0.736976, -0.591009 },
50 { -0.591009, -0.327985, 0.736976 },
51 { -0.736976, 0.591009, -0.327985 }
52 };
53
54 double ref_array_Sigma[3][1] = {
55 { 11.344814 },
56 { 0.515729 },
57 { 0.170915 }
58 }; …Run Code Online (Sandbox Code Playgroud) 我写了一个简单的Fortran代码,其执行的多项式插值n+1点R^2。它使用两个LAPACK程序(我的代码中的所有内容都是双精度)求解线性方程组(我正在创建 Vandermonde 矩阵):
首先,它分解矩阵:http : //sites.science.oregonstate.edu/~landaur/ nacphy/lapack/routines/dgetrf.html
后来系统解决了:http : //sites.science.oregonstate.edu/~landaur/nacphy/lapack/routines/dgetrs.html
该程序适用于从多项式生成的几个测试数据案例:0,1,2,3,4。然而,当我从多项式中提供 11 个点时,P(x) = x^10它推断出完全错误的系数。
输入 ( x..., y...):
1.0
1.001
1.002
1.003
1.004
1.005
1.006
1.007
1.008
1.009
1.01
1.0
1.01004512021
1.02018096336
1.03040825707
1.04072773401
1.05114013204
1.06164619412
1.07224666847
1.08294230847
1.0937338728
1.10462212541
Run Code Online (Sandbox Code Playgroud)
输出 ( a_n,...,a_0):
-4.6992230177E+004
2.2042918738E+005
-3.2949938635E+005
5.0740528522E+004
2.4764893257E+005
-3.1846974845E+004
-1.7195378863E+005
-1.4751075818E+005
4.1766709741E+005
-2.6476448046E+005
5.6082872757E+004
Run Code Online (Sandbox Code Playgroud)
我遇到数值稳定性问题了吗?还是我做错了什么?
编辑:我附上了插值过程的代码(注意,我们实际上没有n点n+1)。
module InterpolatorModule
contains
subroutine interpolate(n, x, y, …Run Code Online (Sandbox Code Playgroud) 我试图在Mac Pro上使用C++ armadillo库(armadillo-0.9.10).我按照README.txt文件中的手动安装说明进行操作.我修改了config.hpp文件,表明我已经安装了LAPACK和BLAS.然后我尝试编译示例.我成功编译并运行example1.cpp,但是当我尝试运行example2.cpp时,它报告我需要安装ATLAS或LAPACK.我将#include标头添加到example2.cpp并使用-framework Accelerate标志在makefile中进行编译.但是,它仍然无法正常工作.是什么赋予了?我应该默认使用Xcode安装LAPACK和BLAS,不是吗?这里的任何帮助都会很精彩.谢谢谢谢!
我必须使用LU分解将简单模型拟合到C中的某些数据(模拟)。在这里我需要做的一个例子:
但是,我遇到了一个更基本的问题:如何在C中安装软件包并在代码中调用它们?
我是C语言的新手,并且习惯于R。但是我有这样的要求来做一些关于矩阵求逆,LU分解的测试,而教授建议使用Lapack来简化事情(因此,我不需要自己编写代码LU分解等)。但是我不知道如何安装该软件包并在我的代码中调用它,以便使用LAPACK的功能。
我有一个Windows 7 64位,正在使用编译器代码块8.02
谢谢你的帮助。