c++ 线性代数入门库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 线性代数入门库相关的知识,希望对你有一定的参考价值。

参考技术A 随着ai的深入,二维甚至多维信息的处理越来越多。C++码农也需要用到较多的算法。明显的线性代数是个基础。网上搜到了 eigen , numcpp , xtensor 这几个库,下面一一提下了。

以前依赖opencv的二维信息处理,现在不够用了,硬着头皮学点了。开始查找c++的矩阵库。当然第一个是eigen了,opencv用的是这个了,这个资格最老。但他跑到gitlab去了。不知道是python太热的缘故还是其他,这个库用的人少,都被ai带偏了,只知道python的numpy的矩阵库了,c++都没存在感了。还好,有个大神写了个类似的numcpp来替代numpy的功能,弥补c++的缺失,听起来确实不爽,也只能这样了。虽然这个库也火,但维护的人少,近期有半年没更新了。

继续找。果然,找到了xtensor库,这个着实高兴了一番。起码也比较火,维护者也很多。顺便解释下tensor,张量的意思,数学物理中用到,大家熟悉的是数组和矩阵,张量其实广义化了,0维的张量就是标量,1维的张量就是向量,2维的张量就是矩阵。

在图像处理中,多是2维和3维的运算,用张量,并且可以在GPU中运算是基本需求,不惧3维数据的大负荷并行运算。这在编程的可视化方面也有一些变化。在调试的时候,如何展示中间变量的张量,方便观察和调试是码农的一大需求。python的强大友好编程,直接没有这个问题,直接打印展示,非常方便,这估计也是流行的一个原因吧。

好在xtensor又给大家一个惊喜,为python的 jupyter加了个插件 ,可以用jupyter直接编译,显示张量结果,仿佛c++也有了python的 动态编译功能 。真是c++科学计算的好兄弟啊!具体,大家可以看看xtensor的官网。

对于入门线性代数的码农来说,一,可以借用opencv处理2维世界的矩阵运算,快速实现图像处理。深入的话可以再看eigen。二,可以直接用numcpp或者xtensor替换numpy,实现张量的运算,我更喜欢用xtensor,因为他可以 直接在jupyter里运行c++的xtensor代码 ,中间张量可视化,和python一样方便,还支持 simd的并行运算 。学习入门!

如何将 lapack 和 BLAS 库链接到 C++ 代码

【中文标题】如何将 lapack 和 BLAS 库链接到 C++ 代码【英文标题】:How to Link lapack and BLAS library to C++ code 【发布时间】:2013-11-10 04:29:30 【问题描述】:

以上是线性代数库。我正在使用犰狳,它就像一个 c++ 包装器/框架,用于链接到 fortran 中更基本的线性代数库。

我可以通过使用带有 -I 标志的 gcc -c 选项的 #include "armadillo" 轻松编译 example.cpp。 这会生成 example.o,它现在应该静态链接到 liblapack_LINUX.a 和 libBLAS_linux.a

两者的位置:

liblapack_LINUX.a :-/home/nimish/HTMLProjects/WP2/lib/lapack/
libBLAS_linux.a :-/home/nimish/HTMLProjects/WP2/lib/blas

我发出以下命令:

gcc -o example.o -L../lib/blas -lblas_LINUX -L../lib/lapack -llapack_LINUX

OR 与绝对路径

nimish@ubuntu:~$ gcc -o example.o -L/home/nimish/HTMLProjects/WP2/lib/blas -lblas_LINUX    -L/home/nimish/HTMLProjects/WP2/lib/lapack -llapack_LINUX

得到错误:

/usr/bin/ld: cannot find -lblas_LINUX
collect2: ld returned 1 exit status

但是这些库确实存在 --

nimish@ubuntu:~$ find /home/nimish/HTMLProjects/WP2 -name liblapack_LINUX.a
/home/nimish/HTMLProjects/WP2/lib/lapack/liblapack_LINUX.a

nimish@ubuntu:~$ find /home/nimish/HTMLProjects/WP2 -name libblas_LINUX.a
/home/nimish/HTMLProjects/WP2/lib/BLAS/libblas_LINUX.a

我做错了什么?我对这个链接库业务以及 gcc 有点陌生。

【问题讨论】:

一开始你有一个错误的命令:do gcc example.o -o example ...。第二个:尝试在目标文件之前放置标志:gcc -L... -l... example.o -o example. 【参考方案1】:

首先,您需要确保使用 (+lapack) 安装了 BLAS

sudo apt-get install libblas-dev liblapack-dev

然后您可以在您的程序文件之后使用 -lblas 进行链接。或者你可以使用 make 文件。

就我而言,我更喜欢使用 OpenBlas,您可以在 makefile 中使用以下内容。

    www.openblas.net,获取 tar.gz 将其复制到您的目录中 解压:tar -zxvf OpenBLAS-0.2.20.tar.gz 编译它:cd OpenBLAS-0.2.20 制作

完成后,您应该拥有文件 libopenblas.a,即 openblas 库

BLASLIB = OpenBLAS/libopenblas.a -lpthread

【讨论】:

以上是关于c++ 线性代数入门库的主要内容,如果未能解决你的问题,请参考以下文章

构建使用 Eigen(用于线性代数的 C++ 模板库)的项目时出现编译器错误

如何将 lapack 和 BLAS 库链接到 C++ 代码

Python数模笔记-PuLP库线性规划入门

交叉编译犰狳线性代数库

非线性优化库ceres入门

非线性优化库ceres入门