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.
|
|
|
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。。。 |