由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++能不能加入一些Matlab的能力呢?
相关主题
C++ 做线性代数,方便使用的库?Matrix calculation in C++
matlab 和 R 的最大(根本)区别?How to use multi-core to speed Python program
经过两个月,矩阵库基本完成,c++11就是好请推荐好的c++下的matrix库
有没有觉得scipy很稀烂的?震惊:java 的矩阵操作比 c++ 快?
[bssd]汇报一下Julia进展搞矩阵的竟然没有人提BLAS
C++ Q11: iteratorIn C++, how to do matrix computation?
为啥matlab一直用列优先存储来存储array?求推荐:fortran好用的debug软件
这偏语言分析的文章很好为什么好多ID 见到 c++就好象 不共戴天呢?
相关话题的讨论汇总
话题: matlab话题: c++话题: std话题: valarray
进入Programming版参与讨论
1 (共1页)
y**b
发帖数: 10166
1
今天把一个三维CFD超声速模拟的Matlab code转成C++代码同其他模拟进行耦合,
发现C++在处理多维数组方面实在是繁琐,比如处理一个动态五维数组,光分配
就得这么搞:
std::valarray< std::valarray< std::valarray AL> > > > > arrayRoeFlux;
arrayRoeFlux.resize(nx);
for (std::size_t i = 0; i < arrayRoeFlux.size(); ++i) {
arrayRoeFlux[i].resize(ny);
for (std::size_t j = 0; j < arrayRoeFlux[i].size(); ++j) {
arrayRoeFlux[i][j].resize(nz);
for (std::size_t k = 0; k < arrayRoeFlux[i][j].size(); ++k) {
arrayRoeFlux[i][j][k].resize(n_integ);
for (std::size_t m = 0; m < arrayRoeFlux[i][j][k].size(); ++m)
arrayRoeFlux[i][j][k][m].resize(nDim);
}
}
}
这还罢了,关键对局部维度进行操作时,Matlab一个简单的语句换成C++代码不知道多么
繁琐易错。觉得C++在numerics方面真该向Matlab学学。那个Blitz++会不会成为C++的一
部分呢。
p***o
发帖数: 1252
2
自己封装一下,(下次用)也不费多少功夫。

RE

【在 y**b 的大作中提到】
: 今天把一个三维CFD超声速模拟的Matlab code转成C++代码同其他模拟进行耦合,
: 发现C++在处理多维数组方面实在是繁琐,比如处理一个动态五维数组,光分配
: 就得这么搞:
: std::valarray< std::valarray< std::valarray : AL> > > > > arrayRoeFlux;
: arrayRoeFlux.resize(nx);
: for (std::size_t i = 0; i < arrayRoeFlux.size(); ++i) {
: arrayRoeFlux[i].resize(ny);
: for (std::size_t j = 0; j < arrayRoeFlux[i].size(); ++j) {
: arrayRoeFlux[i][j].resize(nz);

s****a
发帖数: 238
3
既然知道blitz++为什么不用,基本上和matlab没什么区别了
t*****n
发帖数: 4908
4
tensor?google一下很多啊。比如
http://code.google.com/p/ltensor/

RE

【在 y**b 的大作中提到】
: 今天把一个三维CFD超声速模拟的Matlab code转成C++代码同其他模拟进行耦合,
: 发现C++在处理多维数组方面实在是繁琐,比如处理一个动态五维数组,光分配
: 就得这么搞:
: std::valarray< std::valarray< std::valarray : AL> > > > > arrayRoeFlux;
: arrayRoeFlux.resize(nx);
: for (std::size_t i = 0; i < arrayRoeFlux.size(); ++i) {
: arrayRoeFlux[i].resize(ny);
: for (std::size_t j = 0; j < arrayRoeFlux[i].size(); ++j) {
: arrayRoeFlux[i][j].resize(nz);

w***g
发帖数: 5958
5
blitz++这东西用的不小心性能非常低(但是后来发现了能fix), 我受过其害.
C++的问题是BOOST的目的好像更多的是追求语言上的巧妙, 而不是追求解决实际问题的
方便和高效. 既然你上C++了, 最好的办法是用blitz++/ublas分配内存, 背后上blas和
lapack.

【在 s****a 的大作中提到】
: 既然知道blitz++为什么不用,基本上和matlab没什么区别了
r*********r
发帖数: 3195
6
boost::multi_array is OK as a hi-dimensional data structure, very flexible.
L***n
发帖数: 6727
7
慢...

【在 s****a 的大作中提到】
: 既然知道blitz++为什么不用,基本上和matlab没什么区别了
L***n
发帖数: 6727
8
能具体说说问题和怎么解决的吗?

【在 w***g 的大作中提到】
: blitz++这东西用的不小心性能非常低(但是后来发现了能fix), 我受过其害.
: C++的问题是BOOST的目的好像更多的是追求语言上的巧妙, 而不是追求解决实际问题的
: 方便和高效. 既然你上C++了, 最好的办法是用blitz++/ublas分配内存, 背后上blas和
: lapack.

w***g
发帖数: 5958
9
blitz++经常调用pthread_mutex_lock/unlock, parallelize不小心的话会严重降低速
度. 除此之外还没太发现性能瓶颈. 不过我对速度追求很高, 实际运算都是直接调用的
blas.

【在 L***n 的大作中提到】
: 能具体说说问题和怎么解决的吗?
s****a
发帖数: 238
10
blitz++比boost好用多了,那些复杂的模板表达式全部封装掉,流出来的接口还是很简
单的。
这个库本来就是解决内存管理和用表达式做bitwise operation,这两点上是作得很到
位的,我看过代码,没有一个虚函数,也没有构造中间对象,理论上效率应该和手写的
相当。,复杂一点的操作肯定要把数据导出给其他库完成的,有的文章拿这个黑blitz
实在是为黑而黑。

【在 w***g 的大作中提到】
: blitz++这东西用的不小心性能非常低(但是后来发现了能fix), 我受过其害.
: C++的问题是BOOST的目的好像更多的是追求语言上的巧妙, 而不是追求解决实际问题的
: 方便和高效. 既然你上C++了, 最好的办法是用blitz++/ublas分配内存, 背后上blas和
: lapack.

相关主题
C++ Q11: iteratorMatrix calculation in C++
为啥matlab一直用列优先存储来存储array?How to use multi-core to speed Python program
这偏语言分析的文章很好请推荐好的c++下的matrix库
进入Programming版参与讨论
s****a
发帖数: 238
11
是不是线程安全好像在编译期可选的吧,一般科学计算都是尽量使每个线程处理独立的
数据很少用mutex。不过没有想到mutex可以对速度影响这么大,学习了。

【在 w***g 的大作中提到】
: blitz++经常调用pthread_mutex_lock/unlock, parallelize不小心的话会严重降低速
: 度. 除此之外还没太发现性能瓶颈. 不过我对速度追求很高, 实际运算都是直接调用的
: blas.

t****t
发帖数: 6806
12
不仅mutex影响大, spinlock的影响都很大.

【在 s****a 的大作中提到】
: 是不是线程安全好像在编译期可选的吧,一般科学计算都是尽量使每个线程处理独立的
: 数据很少用mutex。不过没有想到mutex可以对速度影响这么大,学习了。

t*****n
发帖数: 4908
13
blitz++基本已经dead了。模板元的技术也没什么大不了的。现在eigen很热。
http://eigen.tuxfamily.org/index.php?title=Main_Page

blitz

【在 s****a 的大作中提到】
: blitz++比boost好用多了,那些复杂的模板表达式全部封装掉,流出来的接口还是很简
: 单的。
: 这个库本来就是解决内存管理和用表达式做bitwise operation,这两点上是作得很到
: 位的,我看过代码,没有一个虚函数,也没有构造中间对象,理论上效率应该和手写的
: 相当。,复杂一点的操作肯定要把数据导出给其他库完成的,有的文章拿这个黑blitz
: 实在是为黑而黑。

t*****n
发帖数: 4908
14
动态5维正常吧。千万别再造个轮子。

RE

【在 y**b 的大作中提到】
: 今天把一个三维CFD超声速模拟的Matlab code转成C++代码同其他模拟进行耦合,
: 发现C++在处理多维数组方面实在是繁琐,比如处理一个动态五维数组,光分配
: 就得这么搞:
: std::valarray< std::valarray< std::valarray : AL> > > > > arrayRoeFlux;
: arrayRoeFlux.resize(nx);
: for (std::size_t i = 0; i < arrayRoeFlux.size(); ++i) {
: arrayRoeFlux[i].resize(ny);
: for (std::size_t j = 0; j < arrayRoeFlux[i].size(); ++j) {
: arrayRoeFlux[i][j].resize(nz);

s***e
发帖数: 403
15
没这个必要,两者是在不同领域的。
你可以试试eigen
j******t
发帖数: 788
16
可以, 不过你要做TYPE MAPPING, 还要把C++的矩转化成MATLAB,
我的经验是慢, 还有MATLAB6以后都不支持不能在后台运行, C启动matlab以后
,ml的主菜单会打开,你可以关掉它.但是仍然能够看出来.
具体一点, 比如解线性方程,
1, 用engOpen建立matlab engine ,engSetVisible(ep, 0)可以MATLAB主界面藏起来.
2, 用mxCreateDoubleMatrix 你可以建立一个mxArray, 这个相当于C的double*,
3, 然后用memcpy把你C的double* array, 复制到你建立的mxArray
4, 用engPutVariable, 把你建立的mxArray对应到你在MATLAB里面的使用的变量名
5, 用engEvalString,调用你在MATLAB里面的命令.
6, 用engGetVariable把你在MATLAB计算的结果重新设回到C side的 mxArray.
7, 再用memcpy,把结果从mxArray, 改成double*
详细阐述太麻烦了. google我给的KEYWORD把,我可以发给你程序段.如果做商业软件建
议不要用MATLAB吧.
N******K
发帖数: 10202
17
itk试过没有?

RE

【在 y**b 的大作中提到】
: 今天把一个三维CFD超声速模拟的Matlab code转成C++代码同其他模拟进行耦合,
: 发现C++在处理多维数组方面实在是繁琐,比如处理一个动态五维数组,光分配
: 就得这么搞:
: std::valarray< std::valarray< std::valarray : AL> > > > > arrayRoeFlux;
: arrayRoeFlux.resize(nx);
: for (std::size_t i = 0; i < arrayRoeFlux.size(); ++i) {
: arrayRoeFlux[i].resize(ny);
: for (std::size_t j = 0; j < arrayRoeFlux[i].size(); ++j) {
: arrayRoeFlux[i][j].resize(nz);

t*****n
发帖数: 4908
18
matlab的矩阵运算太慢了。

【在 j******t 的大作中提到】
: 可以, 不过你要做TYPE MAPPING, 还要把C++的矩转化成MATLAB,
: 我的经验是慢, 还有MATLAB6以后都不支持不能在后台运行, C启动matlab以后
: ,ml的主菜单会打开,你可以关掉它.但是仍然能够看出来.
: 具体一点, 比如解线性方程,
: 1, 用engOpen建立matlab engine ,engSetVisible(ep, 0)可以MATLAB主界面藏起来.
: 2, 用mxCreateDoubleMatrix 你可以建立一个mxArray, 这个相当于C的double*,
: 3, 然后用memcpy把你C的double* array, 复制到你建立的mxArray
: 4, 用engPutVariable, 把你建立的mxArray对应到你在MATLAB里面的使用的变量名
: 5, 用engEvalString,调用你在MATLAB里面的命令.
: 6, 用engGetVariable把你在MATLAB计算的结果重新设回到C side的 mxArray.

T*****u
发帖数: 7103
19
搞个wrapper不难。如果你的程序大的话,什么时候调用matlab就很tricky。。。
1 (共1页)
进入Programming版参与讨论
相关主题
为什么好多ID 见到 c++就好象 不共戴天呢?[bssd]汇报一下Julia进展
你们都没搞懂为什么大公司要用Java.C++ Q11: iterator
发现版上没有聊fortran的为啥matlab一直用列优先存储来存储array?
用来用去还是Rust是最好的语言,代表今后的方向这偏语言分析的文章很好
C++ 做线性代数,方便使用的库?Matrix calculation in C++
matlab 和 R 的最大(根本)区别?How to use multi-core to speed Python program
经过两个月,矩阵库基本完成,c++11就是好请推荐好的c++下的matrix库
有没有觉得scipy很稀烂的?震惊:java 的矩阵操作比 c++ 快?
相关话题的讨论汇总
话题: matlab话题: c++话题: std话题: valarray