提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
最近需要用C语言进行编程,涉及到矩阵以及特征值分解的的相关计算,需要调用相关的库,在网上看了很多教程,但都很乱且内容不全,由于自己配置成功后对其进行详细的整理,方便自己后续使用,适用于C/C++:
一、编译和安装CLAPACK库
步骤一:下载CLAPACK包,我使用的版本是clapack-3.2.1-CMAKE,具体官方下载链接为:http://icl.cs.utk.edu/lapack-for-windows/clapack/index.html#install
步骤二:下载CMake安装包,我使用的版本是cmake-3.30.1-windows-x86_64,具体官方下载链接为:http://www.cmake.org/

步骤三:将CLAPACK包和CMake安装包,放在不同的文件夹下进行解压,并建立新的文件夹。由下图可知,clapack文件夹里面包含clapack-3.2.1-CMAKE压缩包和myself文件,其中myself是我自己建的文件夹。

步骤四:对文件夹cmake进行打开,并解压cmake-3.30.1-windows-x86_64压缩包

步骤五:打开解压后的cmake-3.30.1-windows-x86_64,再打开bin文件,并点击cmake-gui.exe,进入安装目录,

进入安装目录后,在在where is the source code这里,填写clapack-3.2.1-CMAKE安装包文件夹所在的路径:例如:E:\VS_CLPACK_CMAKE\clapack\clapack-3.2.1-CMAKE,该文件夹包含CMakeLists.txt文件,用于CMake的编译之用);
在where to build the binaries这里,填写新建的myself文件夹的目录,例如:E:\VS_CLPACK_CMAKE\clapack\myself;然后第一次点击configure,会让你选visual studio solution,请选择vs2022后点击确定,就会出现下面的红色背景。再点击第二次configure,红色的背景会变成白色,这时再点击generate,显示generate done,表示编译成功。

步骤六:点击上图中的open project,进入vs2022的工程,并在“ALL_BUILD”上右键,并选择生成选项,“INSTALL”和RUN_TEST也同样右键 ,并选择生成选项。其中INSTALL会把lib 和 .h文件放到cmake创建的目录中 一般在C:\Program Files\CLAPACK中;

二、在vs2022中配置路径
步骤1:
经过上面的编译和安装CLAPACK库的步骤,在C盘的C:\Program Files (x86)\CLAPACK下会有两个文件,分别是include、lib文件

步骤2.配置路径
*用vs2017先建个目录工程,打开项目属性,将步骤1中的路径配置到下面的设置中,具体设置如下:

具体设置如下:


在附加依赖项中
输入:
blasd.lib
lapackd.lib
libf2cd.lib

三、测试代码
下面是一个svd分解的例子
#define _CRT_SECURE_NO_WARNINGS 1
#include "stdio.h"
#include "f2c.h"
#include "clapack.h"
#define SIZE 4
int main()
{
char JOBU;
char JOBVT;
int i;
integer M = SIZE;
integer N = SIZE;
integer LDA = M;
integer LDU = M;
integer LDVT = N;
integer LWORK;
integer INFO;
integer mn = min(M, N);
integer MN = max(M, N);
double a[SIZE * SIZE] = { 16.0, 5.0, 9.0, 4.0, 2.0, 11.0, 7.0, 14.0, 3.0, 10.0, 6.0, 15.0, 13.0, 8.0, 12.0, 1.0 };
double s[SIZE];
double wk[201];
double uu[SIZE * SIZE];
double vt[SIZE * SIZE];
JOBU = 'A';
JOBVT = 'A';
LWORK = 201;
/* Subroutine int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n,
doublereal *a, integer *lda, doublereal *s, doublereal *u, integer *
ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork,
integer *info)
*/
dgesvd_(&JOBU, &JOBVT, &M, &N, a, &LDA, s, uu,
&LDU, vt, &LDVT, wk, &LWORK, &INFO);
if (INFO > 0) {
printf("The algorithm computing SVD failed to converge\n");
exit(1);
}
for (i = 0; i < SIZE; i++) {
printf("\n s[ %d ] = %f", i, s[i]);
}
getchar();
return 0;
}
```测试的结果

526

被折叠的 条评论
为什么被折叠?



