之前一直感觉使用Eigen库(一个C++的矩阵运算库)在代码的可读性上面很强,但是速度上还是有待提高
(之前尝试过最优化求解问题 在计算数量不大的矩阵 (例如: 20*8 的矩阵乘以 8*30的矩阵) Eigen的运算速度没有想象中的快 而且是慢一个数量级.. 使用数组当做矩阵计算时的运算时间仅仅1秒左右而使用Eigen超过了10秒..)
之后尝试使用CUDA 加速矩阵运算。
研究了很长时间看了好几本CUDA的书和PDF使用该文档
(之前有相关博文 当时什么都不懂 按照自己的思路敲了点儿代码 之后看了相关书籍 发现好多基础运算CUDA都有实现 自己还瞎捉摸的瞎敲了一波代码实现基本功能.. 继而也没好意思更新博文很是惭愧 )
但是最终还是没有得到一个好的办法加速矩阵运算
(测试过 10000* 5000或者更大数量的矩阵运算 发现CUDA的运算速度惊人 但是相对几十*几百的矩阵 CUDA的运算速度 目前感觉没有Eigen计算速度快.. )
苦恼之余,近期想着自己写个矩阵运算类尝试矩阵计算 看看运算速度怎么样。
大体实现
Mat Vd2D(100 * 2, 1);
Mat ms_BS2D_really(100 * 2, 76);
Mat ms_Weight(76, 1);
Mat mt_result(1, 1);
Mat Vd3D(100 * 2, 1);
Mat ms_BS3D_really(100 * 2, 76);
for (int time = 0; time < 50000; time++) {
mt_result = (Vd2D -(ms_BS2D_really * ms_Weight)).transpose() * (Vd2D - (ms_BS2D_really * ms_Weight)) * 1.0 +
(Vd3D - (ms_BS3D_really * ms_Weight)).transpose() * (Vd3D -(ms_BS3D_really * ms_Weight)) * 3.0;
double everytime = mt_result(0, 0);
sum += everytime;
}
于是发现得到的结果对Eigen又是肃然起敬..
运算速度在release下
Eigen的运算速度是自己的4~5倍..
下面是本人的矩阵类代码有兴趣的朋友可以了解一下