VS2017在Windows上的编译、安装与使用clapack(用于C/C++)库(亲测有效)

最近因为项目的需要用C语言进行编程,涉及到矩阵的相关计算,需要调用相关的库,百度了很多的网上教程都比较的模糊,还好配置成功了,现在对其进行整理,防止后继在需要配置,适用于C/C++:
主要是参考这篇博文:CLAPACK在Windows上的编译、安装与使用
1、CLAPACK的编译与安装:
以下链接是CLAPACK的官方网站,也可以根据官方网站进行配置。
http://icl.cs.utk.edu/lapack-for-windows/clapack/index.html#install
具体的步骤为:
(1)下载clapack包;我使用的是clapack-3.2.1-CMAKE版本。
clapack-3.2.1-CMAKE安装包
(2)下载CMake安装包,可参考网站http://www.cmake.org/;我使用的是cmake-3.20.1-windows-x86_64版本。
cmake-3.20.1-windows-x86_64安装包
(3)进行以下的安装步骤:
①:在自己的D盘新建一个文件夹,命名CMAKE,里面放clapack-3.2.1-CMAKE安装包文件夹,并自己新建个文件夹myself,用于后继安装;
在这里插入图片描述
②:打开CMake安装包,点击cmake-gui.exe,进入安装目录;
在这里插入图片描述
③:在where is the source code这里,填写clapack-3.2.1-CMAKE安装包文件夹所在的路径(例如 D:\CMAKE\clapack-3.2.1-CMAKE,该文件夹包含CMakeLists.txt文件,用于CMake的编译之用);
在这里插入图片描述
在这里插入图片描述
④:在where to build the binaries这里,最好填写一个与上面文件夹不同的文件夹,可以自己新建一个,我自己新建的myself文件夹,也可以使用上面的文件夹,但后续的文件会不方便找。
⑤:点击configure,这时会让你选择visual studio solution,请选择vs2017(也就是vs2017),这里如果用默认的vs,会出现错误。
⑥:再次点击configure,直到下面的对话框编程白色为止;
在这里插入图片描述
⑦:点击generate,显示generate done,表示编译成功;
⑧:关闭CMake。
(4)打开where to build the binaries所指向的文件夹,里面会用vs2017的工程,用vs2017打开它。
(5)build“ALL_BUILD”将会build解决方案。
(6)build“INSTALL”会把lib 和 .h文件放到cmake创建的目录中 一般在C:\Program Files\CLAPACK中。
(7)bulid“RUN_TEST” 执行测试文件。
如果没修改CMAKE中的设置,那么搞定第6个步骤后,你会在C:\Program Files\CLAPACK发现你所需要的*.h和*.lib;
备注:
①:在RUN_TESTS有部分不能通过,也不影响其余功能的正常使用;
②:此处 build 是指右键生成;
在这里插入图片描述
③:在build "INSTALL"时可能会报 “setlocal……” 这个错误,解决方法是以管理员身份运行visual studio,然后再打开项目,再按照原文开始 build “ALL_BUILD”、“INSTALL”、“RUN_TEST”;
在这里插入图片描述
(8)对vs2017需要设置成如下所示:
①:自己的C盘下会有如下的文件生成:
在这里插入图片描述
②:用vs2017先建个目录工程,打开项目属性,按如下的操作进行设置即可:
在这里插入图片描述
在这里插入图片描述
输入:
blasd.lib
lapackd.lib
libf2cd.lib
在这里插入图片描述
2、CLAPACK的测试使用:
(1)测试代码一:(ceshi.cpp)

#include "iostream"
#include "f2c.h"        
#include "clapack.h"
using namespace std;
int main() {
    char transa = 'T', transb = 'T';
    integer M = 2, N = 2, K = 2, LDA = K, LDB = N, LDC = M;
    double alpha = 1.0, A[4] = { 1, 2, 3, 4}, B[4] = { 5, 6, 7, 8 }, beta = 0.0, C[4]; //下面的函数的意思是C = 1.0 * T(A) * T(B) + 0 * C,其中T()表示将某个矩阵转置
    //注意此时得到的C是按列存放的
    dgemm_(&transa, &transb, &M, &N, &K, &alpha, A, &LDA, B, &LDB, &beta, C, &LDC);  
    cout<<C[0]<<" "<<C[2]<<endl;
    cout<<C[1]<<" "<<C[3]<<endl;
    return 0;
}

上述代码用于计算矩阵相乘: 在这里插入图片描述
运行结果如下:
在这里插入图片描述
(2)测试代码二:(ceshi.c)
下面是一个svd分解的例子

#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;
}

测试结果为:
s[ 0 ] = 34.000000
s[ 1 ] = 17.888544
s[ 2 ] = 4.472136
s[ 3 ] = 0.000000
在这里插入图片描述

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值