由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 经过两个月,矩阵库基本完成,c++11就是好
相关主题
求推荐:fortran好用的debug软件C编译器为何允许一个函数在某个路径不返回值?
刚看完类这一章,有些大小问题,请指教,谢谢求问C++问题
门外汉求教 return statement用法关于函数返回值的问题
请教大虾们一个C++返回值问题一道笔试题
operator++ 返回值问题你们都检查这些system call的返回值吗?
师傅们都出来看看吧,我也问个C++返回值问题。C# and WPF 类的转换
C++的exception大家常用吗?求助,window10下安装不了armadillo库
请问C++返回值和返回引用区别问个函数线性组合的问题
相关话题的讨论汇总
话题: c++话题: 矩阵话题: matlab话题: eigen话题: 表达式
进入Programming版参与讨论
1 (共1页)
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
3
t**r
发帖数: 3428
4
赞。
公布代码倒github么?愿意学习一下
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
10
这属于接口没定义好
相关主题
师傅们都出来看看吧,我也问个C++返回值问题。C编译器为何允许一个函数在某个路径不返回值?
C++的exception大家常用吗?求问C++问题
请问C++返回值和返回引用区别关于函数返回值的问题
进入Programming版参与讨论
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++新加入的"&&"语法
: 提示?

相关主题
一道笔试题求助,window10下安装不了armadillo库
你们都检查这些system call的返回值吗?问个函数线性组合的问题
C# and WPF 类的转换在高盛当码农是什么个感觉?
进入Programming版参与讨论
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的

相关主题
可有用C++的同志?刚看完类这一章,有些大小问题,请指教,谢谢
请教一个OOP的C++问题门外汉求教 return statement用法
求推荐:fortran好用的debug软件请教大虾们一个C++返回值问题
进入Programming版参与讨论
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相应的元素置零

相关主题
请教大虾们一个C++返回值问题C++的exception大家常用吗?
operator++ 返回值问题请问C++返回值和返回引用区别
师傅们都出来看看吧,我也问个C++返回值问题。C编译器为何允许一个函数在某个路径不返回值?
进入Programming版参与讨论
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++代码

1 (共1页)
进入Programming版参与讨论
相关主题
问个函数线性组合的问题operator++ 返回值问题
在高盛当码农是什么个感觉?师傅们都出来看看吧,我也问个C++返回值问题。
可有用C++的同志?C++的exception大家常用吗?
请教一个OOP的C++问题请问C++返回值和返回引用区别
求推荐:fortran好用的debug软件C编译器为何允许一个函数在某个路径不返回值?
刚看完类这一章,有些大小问题,请指教,谢谢求问C++问题
门外汉求教 return statement用法关于函数返回值的问题
请教大虾们一个C++返回值问题一道笔试题
相关话题的讨论汇总
话题: c++话题: 矩阵话题: matlab话题: eigen话题: 表达式