N******K 发帖数: 10202 | 1 std::move rvalue reference
move constructor
这些东西真是好用
现在可以直接传值进函数 返回值 不用new一个东西再返回这种 古老的玩意
初步测试 性能接近 armadillo 线性组合运算比armadillo 快1~2倍 -》这是没有用
任何并行库的条件下
矩阵运算表达式可以跟matlab一样 直接ctrl-c ctrl-v 改一改 就行了
举个例子:
A B C为矩阵
c++代码
C = 1.0 + A*A + A * (10.0 + A*B({0,1,2}, {0,1,2}));
Matlab代码
C = 1.0 + A*A + A * (10.0 + A*B([1,2,3], [1,2,3])); |
N******K 发帖数: 10202 | 2 本来想写个wrapper就行了 结果越写越来劲 干脆写一个带表达式功能的
表达式做了优化 比 armadillo等 采用了新方法 代码容易读和维护
这才是c++11 的用武之地 java在这个领域基本是废柴
【在 N******K 的大作中提到】 : std::move rvalue reference : move constructor : 这些东西真是好用 : 现在可以直接传值进函数 返回值 不用new一个东西再返回这种 古老的玩意 : 初步测试 性能接近 armadillo 线性组合运算比armadillo 快1~2倍 -》这是没有用 : 任何并行库的条件下 : 矩阵运算表达式可以跟matlab一样 直接ctrl-c ctrl-v 改一改 就行了 : 举个例子: : A B C为矩阵 : c++代码
|
k**********g 发帖数: 989 | |
t**r 发帖数: 3428 | |
b*******s 发帖数: 5216 | 5 嗯,干得不坏
【在 N******K 的大作中提到】 : std::move rvalue reference : move constructor : 这些东西真是好用 : 现在可以直接传值进函数 返回值 不用new一个东西再返回这种 古老的玩意 : 初步测试 性能接近 armadillo 线性组合运算比armadillo 快1~2倍 -》这是没有用 : 任何并行库的条件下 : 矩阵运算表达式可以跟matlab一样 直接ctrl-c ctrl-v 改一改 就行了 : 举个例子: : A B C为矩阵 : c++代码
|
s********i 发帖数: 145 | 6 Why re-invent the wheel?
Use Eigen library! |
n******t 发帖数: 4406 | 7 ......忒无聊了。
【在 N******K 的大作中提到】 : std::move rvalue reference : move constructor : 这些东西真是好用 : 现在可以直接传值进函数 返回值 不用new一个东西再返回这种 古老的玩意 : 初步测试 性能接近 armadillo 线性组合运算比armadillo 快1~2倍 -》这是没有用 : 任何并行库的条件下 : 矩阵运算表达式可以跟matlab一样 直接ctrl-c ctrl-v 改一改 就行了 : 举个例子: : A B C为矩阵 : c++代码
|
d****n 发帖数: 12461 | 8 可能和blas有关。啥blas?
【在 N******K 的大作中提到】 : std::move rvalue reference : move constructor : 这些东西真是好用 : 现在可以直接传值进函数 返回值 不用new一个东西再返回这种 古老的玩意 : 初步测试 性能接近 armadillo 线性组合运算比armadillo 快1~2倍 -》这是没有用 : 任何并行库的条件下 : 矩阵运算表达式可以跟matlab一样 直接ctrl-c ctrl-v 改一改 就行了 : 举个例子: : A B C为矩阵 : c++代码
|
t****t 发帖数: 6806 | 9 传引用或传prvalue其实性能没什么区别, 返回值从来都不需要new.
C++11的新特性在于compiler能自动发现可以做原地操作的步骤, 从而调用相应的
signature. 而不是什么传值和传引用的区别.
【在 N******K 的大作中提到】 : std::move rvalue reference : move constructor : 这些东西真是好用 : 现在可以直接传值进函数 返回值 不用new一个东西再返回这种 古老的玩意 : 初步测试 性能接近 armadillo 线性组合运算比armadillo 快1~2倍 -》这是没有用 : 任何并行库的条件下 : 矩阵运算表达式可以跟matlab一样 直接ctrl-c ctrl-v 改一改 就行了 : 举个例子: : A B C为矩阵 : c++代码
|
f****4 发帖数: 1359 | |
|
|
b*******s 发帖数: 5216 | 11 返回值优化是缺省的?
【在 t****t 的大作中提到】 : 传引用或传prvalue其实性能没什么区别, 返回值从来都不需要new. : C++11的新特性在于compiler能自动发现可以做原地操作的步骤, 从而调用相应的 : signature. 而不是什么传值和传引用的区别.
|
N******K 发帖数: 10202 | 12 std::move这个以前就有?
我说的new 是指一种编程风格 比如itk 把所有对象的都new出来 把所有的 copy
constructor 和 operator= 都给禁掉
这种风格根本不能用于矩阵库
【在 t****t 的大作中提到】 : 传引用或传prvalue其实性能没什么区别, 返回值从来都不需要new. : C++11的新特性在于compiler能自动发现可以做原地操作的步骤, 从而调用相应的 : signature. 而不是什么传值和传引用的区别.
|
N******K 发帖数: 10202 | 13 别激动 我没说不用你的 eigen
我的库 底层调用的是 armodillo 的一些函数 我不用自己lapack等的接口
最近要用 congjugate 算法 我就把eigen调用就行了
搜一搜我以前的文章 你就知道我搞这个库干啥了
矩阵表达式 我的库完全和matlab一致 方便把研究项目的代码 变为c++的代码
【在 s********i 的大作中提到】 : Why re-invent the wheel? : Use Eigen library!
|
N******K 发帖数: 10202 | 14 这是研究项目 暂时不会公开
你可以看看 eigen或者armodillo
【在 t**r 的大作中提到】 : 赞。 : 公布代码倒github么?愿意学习一下
|
t****t 发帖数: 6806 | 15 move以前没有. 但是move是为了&&类型, 即xvalue服务的(前面我脑子进水了说prvalue
). C++11的新特性核心在于编译器对于xvalue的识别和区分, 即告诉函数, 这个对象其
它地方不要了, 你可以破坏掉. 这才是C++11新加的东西. 至于返回对象还是返回new,
那是风格的问题, 跟C++11无关.
至于矩阵库, matlab以前有C++ math library, 其实跟这个差不多. 当然语法上没有你
这个干净, 后来他们不支持了. 10年前我就写过对这个的wrapper, 作为对C++的练手.
除了没有C++11的特性以外(initializer_list, xvalue), 其它的跟你的一样. 但是
matlab的矩阵本身是copy-on-write的, 所以新开对象的开销是很小的.
【在 N******K 的大作中提到】 : std::move这个以前就有? : 我说的new 是指一种编程风格 比如itk 把所有对象的都new出来 把所有的 copy : constructor 和 operator= 都给禁掉 : 这种风格根本不能用于矩阵库
|
N******K 发帖数: 10202 | 16 10年前c++确实可以写矩阵库 但是很有可能写出来的性能很弱
比如 C= A+B+D 就得产生好几个临时矩阵 (A+B) ((A+B)+D) 要分配内存等等 浪费,
如果函数返回,还得模拟一个 std::move 我还真手动模拟了一个 std::move 结果发
现c++11就有
我写的这个 如果是线性组合 根本不用产生临时矩阵
另外 matlab的copy-on-write 是有性能问题的 应为matlab函数是传值 所以搞copy-on
-write 如果c++也搞 那就疯了
我一开始完全模仿matlab 搞的也是copy-on-write
比如
A, B是两个矩阵
B=A; //只是共享数据,不拷贝,一般称为shallow copy
A(1,1)=0; // A发现有别人共享数据,那就在修改前复制一份,然后修改元素(1,1)
这样在所有的元素(i,j)操作,都要检查一下,疯了
c++有 const 引用 根本不需要 copy-on-write
我就把 c++矩阵库 的copy-on-write 功能给去掉了
prvalue
,
.
【在 t****t 的大作中提到】 : move以前没有. 但是move是为了&&类型, 即xvalue服务的(前面我脑子进水了说prvalue : ). C++11的新特性核心在于编译器对于xvalue的识别和区分, 即告诉函数, 这个对象其 : 它地方不要了, 你可以破坏掉. 这才是C++11新加的东西. 至于返回对象还是返回new, : 那是风格的问题, 跟C++11无关. : 至于矩阵库, matlab以前有C++ math library, 其实跟这个差不多. 当然语法上没有你 : 这个干净, 后来他们不支持了. 10年前我就写过对这个的wrapper, 作为对C++的练手. : 除了没有C++11的特性以外(initializer_list, xvalue), 其它的跟你的一样. 但是 : matlab的矩阵本身是copy-on-write的, 所以新开对象的开销是很小的.
|
n****1 发帖数: 1136 | 17 干嘛不直接写个matlab matrix syntax parser? |
n****1 发帖数: 1136 | 18 您别糊弄我, compiler能否自动发现原地操作步骤, 还是需要C++新加入的"&&"语法
提示?
【在 t****t 的大作中提到】 : 传引用或传prvalue其实性能没什么区别, 返回值从来都不需要new. : C++11的新特性在于compiler能自动发现可以做原地操作的步骤, 从而调用相应的 : signature. 而不是什么传值和传引用的区别.
|
N******K 发帖数: 10202 | 19 干嘛不直接写个matlab?
【在 n****1 的大作中提到】 : 干嘛不直接写个matlab matrix syntax parser?
|
t****t 发帖数: 6806 | 20 OK, 我说的不准确. 我的意思是, 在表达式分析里, 很多中间值是作为临时对象产生的
, 使用这些中间值的操作可以potentially做原地(因为初始值不要了). 至于是不是真的
可以原地当然是另一回事.
【在 n****1 的大作中提到】 : 您别糊弄我, compiler能否自动发现原地操作步骤, 还是需要C++新加入的"&&"语法 : 提示?
|
|
|
t****t 发帖数: 6806 | 21 很对, 所以你这里写的才是真正用C++11新特性的地方, 而不是你第一贴里说的那些. 那
些根本牛头不对马嘴.
on
【在 N******K 的大作中提到】 : 10年前c++确实可以写矩阵库 但是很有可能写出来的性能很弱 : 比如 C= A+B+D 就得产生好几个临时矩阵 (A+B) ((A+B)+D) 要分配内存等等 浪费, : 如果函数返回,还得模拟一个 std::move 我还真手动模拟了一个 std::move 结果发 : 现c++11就有 : 我写的这个 如果是线性组合 根本不用产生临时矩阵 : 另外 matlab的copy-on-write 是有性能问题的 应为matlab函数是传值 所以搞copy-on : -write 如果c++也搞 那就疯了 : 我一开始完全模仿matlab 搞的也是copy-on-write : 比如 : A, B是两个矩阵
|
n****1 发帖数: 1136 | 22 matrix syntax只是matlab所有语法中最简单的子集,工作量差几个数量级吧.
【在 N******K 的大作中提到】 : 干嘛不直接写个matlab?
|
n****1 发帖数: 1136 | 23 “线性组合运算比armadillo 快1~2倍”,指的是+ - .*这些么? 逆矩阵算不算“线性
组合运算”?
矩阵运算的瓶颈主要是在逆矩阵,eigen value这些,+/-这些优化意义不大吧。 |
l*********s 发帖数: 5409 | 24 有些可以,比如最后返回值自动调用。
【在 n****1 的大作中提到】 : 您别糊弄我, compiler能否自动发现原地操作步骤, 还是需要C++新加入的"&&"语法 : 提示?
|
k**********g 发帖数: 989 | 25
http://gandalf-library.sourceforge.net/tutorial/report/node27.h
【在 N******K 的大作中提到】 : 10年前c++确实可以写矩阵库 但是很有可能写出来的性能很弱 : 比如 C= A+B+D 就得产生好几个临时矩阵 (A+B) ((A+B)+D) 要分配内存等等 浪费, : 如果函数返回,还得模拟一个 std::move 我还真手动模拟了一个 std::move 结果发 : 现c++11就有 : 我写的这个 如果是线性组合 根本不用产生临时矩阵 : 另外 matlab的copy-on-write 是有性能问题的 应为matlab函数是传值 所以搞copy-on : -write 如果c++也搞 那就疯了 : 我一开始完全模仿matlab 搞的也是copy-on-write : 比如 : A, B是两个矩阵
|
N******K 发帖数: 10202 | 26 图像分析 里面 很多线性组合的 比如 sparse coding
你可以那纯的for loop写 但是用表达式 增加可读性 不然过两天 自己都看不懂自己
写的代码
这样可以直接用c++做研究 不用matlab了
【在 n****1 的大作中提到】 : “线性组合运算比armadillo 快1~2倍”,指的是+ - .*这些么? 逆矩阵算不算“线性 : 组合运算”? : 矩阵运算的瓶颈主要是在逆矩阵,eigen value这些,+/-这些优化意义不大吧。
|
l*********s 发帖数: 5409 | 27 don't reinvent wheels, use matlab
【在 N******K 的大作中提到】 : 图像分析 里面 很多线性组合的 比如 sparse coding : 你可以那纯的for loop写 但是用表达式 增加可读性 不然过两天 自己都看不懂自己 : 写的代码 : 这样可以直接用c++做研究 不用matlab了
|
L***n 发帖数: 6727 | 28 你能用c++实现和matlab源码兼容的array slicing?那倒有点意思,不过
我觉得你实现不了
【在 N******K 的大作中提到】 : 别激动 我没说不用你的 eigen : 我的库 底层调用的是 armodillo 的一些函数 我不用自己lapack等的接口 : 最近要用 congjugate 算法 我就把eigen调用就行了 : 搜一搜我以前的文章 你就知道我搞这个库干啥了 : 矩阵表达式 我的库完全和matlab一致 方便把研究项目的代码 变为c++的代码
|
L***n 发帖数: 6727 | 29 线性组合太trivial了吧,benchmark一下eigen, blitz, blaze...这些都是用
expression template的
【在 n****1 的大作中提到】 : “线性组合运算比armadillo 快1~2倍”,指的是+ - .*这些么? 逆矩阵算不算“线性 : 组合运算”? : 矩阵运算的瓶颈主要是在逆矩阵,eigen value这些,+/-这些优化意义不大吧。
|
s****a 发帖数: 238 | 30 感觉即使用了move语义还是不如模板表达式,遇到A=B+C+D这种情况还是要生成临时对
象,只不过只要生成一次。而且模板表达式是把所有操作一次做完,中间变量放寄存器
,move语义就算覆盖不要的对象还是要访问一次内存。
【在 L***n 的大作中提到】 : 线性组合太trivial了吧,benchmark一下eigen, blitz, blaze...这些都是用 : expression template的
|
|
|
P**********k 发帖数: 1629 | 31 为什么不用eigen呢。。。。
哎,有这时间干点啥不好。。。
【在 N******K 的大作中提到】 : std::move rvalue reference : move constructor : 这些东西真是好用 : 现在可以直接传值进函数 返回值 不用new一个东西再返回这种 古老的玩意 : 初步测试 性能接近 armadillo 线性组合运算比armadillo 快1~2倍 -》这是没有用 : 任何并行库的条件下 : 矩阵运算表达式可以跟matlab一样 直接ctrl-c ctrl-v 改一改 就行了 : 举个例子: : A B C为矩阵 : c++代码
|
N******K 发帖数: 10202 | 32 时间省下来干啥? 学某人去日本嫖赌?
【在 P**********k 的大作中提到】 : 为什么不用eigen呢。。。。 : 哎,有这时间干点啥不好。。。
|
N******K 发帖数: 10202 | 33 我不用模板表达式 A=B+C+D 也是只生成一个临时矩阵
【在 s****a 的大作中提到】 : 感觉即使用了move语义还是不如模板表达式,遇到A=B+C+D这种情况还是要生成临时对 : 象,只不过只要生成一次。而且模板表达式是把所有操作一次做完,中间变量放寄存器 : ,move语义就算覆盖不要的对象还是要访问一次内存。
|
N******K 发帖数: 10202 | 34 我搞这个的目的不是取代eigen等库 而是更好的使用这些库
【在 L***n 的大作中提到】 : 线性组合太trivial了吧,benchmark一下eigen, blitz, blaze...这些都是用 : expression template的
|
N******K 发帖数: 10202 | 35 matlab 开发的东西 你怎么搞产品卖钱?
【在 l*********s 的大作中提到】 : don't reinvent wheels, use matlab
|
N******K 发帖数: 10202 | 36 matlab
A(:, [1,2, 3])
C++
A(ALL, {0,1,2})
我全都实现了
【在 L***n 的大作中提到】 : 你能用c++实现和matlab源码兼容的array slicing?那倒有点意思,不过 : 我觉得你实现不了
|
N******K 发帖数: 10202 | 37 我写这个的目的是增加c++代码可读性 可以直接用c++搞研究
【在 n****1 的大作中提到】 : “线性组合运算比armadillo 快1~2倍”,指的是+ - .*这些么? 逆矩阵算不算“线性 : 组合运算”? : 矩阵运算的瓶颈主要是在逆矩阵,eigen value这些,+/-这些优化意义不大吧。
|
t****t 发帖数: 6806 | 38 你确定这个做的是slicing? 据我所知matlab做这个是不一定生成新矩阵的.
【在 N******K 的大作中提到】 : matlab : A(:, [1,2, 3]) : C++ : A(ALL, {0,1,2}) : 我全都实现了
|
N******K 发帖数: 10202 | 39 A(ALL,{0,1,2})生成一个索引矩阵 只存A的shallow copy 和 ALL,{0,1,2}
A(ALL,{0,1,2}) = 0 就把A相应的元素置零
【在 t****t 的大作中提到】 : 你确定这个做的是slicing? 据我所知matlab做这个是不一定生成新矩阵的.
|
t****t 发帖数: 6806 | 40 不错!
【在 N******K 的大作中提到】 : A(ALL,{0,1,2})生成一个索引矩阵 只存A的shallow copy 和 ALL,{0,1,2} : A(ALL,{0,1,2}) = 0 就把A相应的元素置零
|
|
|
l*********s 发帖数: 5409 | 41 jpm是在sas基础上开发的,也不影响它卖钱。matlab又不贵,你有必要替用户省钱嘛?
【在 N******K 的大作中提到】 : matlab 开发的东西 你怎么搞产品卖钱?
|
L***n 发帖数: 6727 | 42 1:10 怎么办呢?不会只能用ALL吧
【在 N******K 的大作中提到】 : matlab : A(:, [1,2, 3]) : C++ : A(ALL, {0,1,2}) : 我全都实现了
|
N******K 发帖数: 10202 | 43 直接写{0,1,2,3,4,5,6,7,8,9}
或者整一个 span(1,10) 返回一个列表页可以
对这个情况 我写了一个特殊函数 A.SubMatrix(0,9,0,99) 相当于 A(1:10,1:100)
:号这个 c++不好重载
【在 L***n 的大作中提到】 : 1:10 怎么办呢?不会只能用ALL吧
|
e***e 发帖数: 3872 | 44 赞一个!
什么时候nvcc支持11了,可以跟cusp融合一下,像thrust那样做一些不同的backends。
最重要的是能方便的支持(稀疏)矩阵运算扩展,像(+, min/max)那些……
【在 N******K 的大作中提到】 : std::move rvalue reference : move constructor : 这些东西真是好用 : 现在可以直接传值进函数 返回值 不用new一个东西再返回这种 古老的玩意 : 初步测试 性能接近 armadillo 线性组合运算比armadillo 快1~2倍 -》这是没有用 : 任何并行库的条件下 : 矩阵运算表达式可以跟matlab一样 直接ctrl-c ctrl-v 改一改 就行了 : 举个例子: : A B C为矩阵 : c++代码
|