Matlab to C++ using boost.ublas and boost.bindings

本文介绍了如何使用boost.ublas和boost.bindings将Matlab代码转换为C++,并详细阐述了编译过程,包括设置STATIC_ALLOCATION为1,编译生成dll和lib文件的步骤,适合C++开发者进行矩阵运算的移植工作。
 博士阶段的研究应用了大量矩阵计算,现在要转到C++上来,一般的数值线性代数库都是采用Fortran编写的,用C++调用起来比较麻烦,boost.ublas和boost.bindings结合可以实现方便的调用。

boost.ublas是使用纯C++实现的BLAS的替代品,但不依赖于BLAS,接口友好,当然C++实现在效率上比BLAS就要差很远了。boost.bindings还没有正式纳入boost,现在在boost sandbox中,它提供了通过C++调用BLAS, LAPACK, ATLAS和UMFPACK的接口,通过Type Traits技术,这些接口可以接收boost.ublas的数据如ublas::matrix进行计算,使用起来十分方便。

boost.bindings源码下载地址,svn checkout
http://svn.boost.org/svn/boost/sandbox/boost/numeric/bindings/
boost.bindings文档和example
http://www.cs.colostate.edu/~nate/tutorial/bs-nb.tgz


GotoBlas编译
据说gotoblas是现在最快的BLAS,下载了最新的1.22版进行了编译,我的系统是windows,编译平台用的cygwin,备忘一点编译经验:
  1. 编译:解压后根据说明修改Makefile.rule中的STATIC_ALLOCATION = 1,make编译,编译时间长啊
  2. 生成dll:编译完成后进入exports目录,make dll
  3. 生成lib:根据def生成lib,打开vc9控制台,进入exports目录,lib /machine:i386 /def:文件名.def,即可生成vc可以链接的lib。
我这里的文件名是libgoto_core2-r1.22.lib和libgoto_core2-r1.22.dll
#pragma  comment(lib, "libgoto_core2-r1.22.lib")

#include 
< iostream >
#include 
< memory >
#include 
< boost / numeric / ublas / matrix.hpp >    
#include 
< boost / numeric / ublas / vector.hpp >   
#include 
< boost / numeric / ublas / io.hpp >

#include 
< boost / numeric / bindings / blas / blas.hpp >
#include 
< boost / numeric / bindings / traits / ublas_matrix.hpp >
#include 
< boost / numeric / bindings / traits / ublas_vector.hpp >
#include 
< boost / numeric / bindings / traits / std_vector.hpp >

namespace  ublas  =  boost::numeric::ublas;
namespace  blas  =  boost::numeric::bindings::blas;

int  main()  {
    std::size_t n 
= 3;
    ublas::matrix
<double> A (n, n);
    
// fill matrix A
    A(00= 3; A(01= 2; A(02= 1;
    A(
10= 1; A(11= 1; A(12
<think>好的,我现在需要解决用户提出的关于cryptography库中openssl绑定相关的问题。用户提到了导入错误,比如“ImportError: DLL load failed”或者找不到模块。首先,我得回忆一下常见的这类问题的解决方法。 根据用户提供的引用内容,有几个可能的解决方案。比如,手动安装cryptography库,或者卸载并重新安装pyopenssl和cryptography。此外,可能还涉及到依赖库的问题,比如openssl本身的版本是否兼容。 接下来,我需要整理这些步骤,确保用户能够按照清晰的指引操作。可能需要分步骤说明,比如先卸载现有的包,再重新安装,或者检查系统环境变量。同时,要提醒用户注意安装时的权限问题,可能需要使用管理员权限或者虚拟环境。 另外,用户可能遇到的不仅仅是安装问题,还可能是在使用这些绑定时的方法错误。因此,除了解决导入错误外,还需要提供一些基本的使用示例,帮助用户正确调用相关的API。例如,如何初始化OpenSSL的绑定,或者常见的加密操作步骤。 还要考虑不同操作系统下的差异,比如Windows和Linux在DLL加载上的不同表现。可能需要建议用户检查系统路径,或者安装必要的运行时库,如Visual C++ Redistributable等。 最后,需要确保回答结构清晰,先解决错误,再介绍使用方法,最后提供预防措施和参考资料。这样用户能够逐步排查问题,并理解背后的原因,避免未来再次出现类似错误。</think>### cryptography库中OpenSSL绑定的使用与错误处理 #### 1. 常见错误及解决方法 当使用`cryptography.hazmat.bindings.openssl`时,可能遇到以下典型错误: **错误示例**: ```python from cryptography.hazmat.bindings._openssl import ffi, lib ImportError: DLL load failed: 找不到指定的程序 ``` **原因分析**: - OpenSSL动态链接库(DLL/SO)未正确安装或版本不兼容[^2][^3]。 - `cryptography`或`pyopenssl`库安装损坏或版本冲突。 **解决步骤**: 1. **清理并重新安装依赖**: ```bash # 卸载旧版本 pip uninstall pyopenssl cryptography -y # 安装最新版本 pip install --upgrade pyopenssl cryptography ``` 此操作可修复因版本冲突或文件损坏导致的问题。 2. **检查系统OpenSSL环境**: - **Windows**:确保系统路径包含OpenSSL的`bin`目录(如`C:\OpenSSL-Win64\bin`)。 - **Linux/macOS**:通过包管理器安装开发库: ```bash # Ubuntu/Debian sudo apt-get install libssl-dev # macOS (Homebrew) brew install openssl ``` 3. **验证安装**: ```python from cryptography.hazmat.backends import default_backend backend = default_backend() # 若无报错,则绑定正常 ``` --- #### 2. OpenSSL绑定的基础用法 `cryptography`的Hazmat层(*Hazardous Materials*)直接调用OpenSSL底层接口,需谨慎使用: **示例:生成随机数** ```python from cryptography.hazmat.primitives import hashes from cryptography.hazmat.backends.openssl.backend import backend # 使用OpenSSL生成16字节随机数 random_bytes = backend.openssl_random_bytes(16) print(f"随机数: {random_bytes.hex()}") ``` **关键API**: - **加密算法实现**:通过`backend.create_对称加密实例(...)`调用。 - **证书操作**:使用`X509`对象解析或生成证书。 --- #### 3. 预防性措施 1. **虚拟环境隔离**: ```bash python -m venv myenv source myenv/bin/activate # Linux/macOS myenv\Scripts\activate.bat # Windows pip install cryptography ``` 避免全局包污染。 2. **版本兼容性检查**: - 查看[cryptography官方文档](https://cryptography.io/en/latest/)确认支持的OpenSSL版本。 - 使用`openssl version`命令验证系统OpenSSL版本。 --- ####
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值