c – 特征中的矩阵乘法非常慢

c – 特征中的矩阵乘法非常慢,第1张

概述我已经实现了Gauss-Newton优化过程,该过程包括通过求解线性化系统Hx = b来计算增量. H matrx由H = J.transpose()* W * J计算,b由b = J.transpose()*(W * e)计算,其中e是误差向量.这里的雅可比矩阵是一个n乘6的矩阵,其中n是千,并且在迭代中保持不变,W是一个n乘n的对角线权重矩阵,它将在迭代中改变(一些对角线元素将被设置为零).但 我已经实现了Gauss-Newton优化过程,该过程包括通过求解线性化系统Hx = b来计算增量. H matrx由H = J.transpose()* W * J计算,b由b = J.transpose()*(W * e)计算,其中e是误差向量.这里的雅可比矩阵是一个n乘6的矩阵,其中n是千,并且在迭代中保持不变,W是一个n乘n的对角线权重矩阵,它将在迭代中改变(一些对角线元素将被设置为零).但是我遇到了速度问题.

当我没有添加权重矩阵W,即H = J.transpose()* J和b = J.transpose()* e时,我的Gauss-Newton过程可以在0.02秒内非常快地运行30次.然而,当我添加在迭代循环之外定义的W矩阵时,它变得如此慢(30次迭代时为0.3~0.7秒)并且我不明白它是否是我的编码问题或通常需要这么长时间.

这里的一切都是特征矩阵和向量.

我使用逆方差向量在特征库中使用.asDiagonal()函数定义了我的W矩阵.然后在H ad b的计算中使用它.然后它变得非常慢.我希望得到一些关于这种巨大放缓的潜在原因的暗示.

编辑:

只有两个矩阵.雅可比人绝对是密集的.权重矩阵是由函数vec.asDiagonal()从向量生成的,它来自密集库,所以我认为它也是密集的.

代码非常简单,导致时间变化的唯一区别是增加了权重矩阵.这是一段代码:

for (int iter=0; iter<max_iter; ++iter) {    // obtain error vector    error = ...      // calculate H and b - the fast one    Eigen::MatrixXf H = J.transpose() * J;    Eigen::VectorXf b = J.transpose() * error;    // calculate H and b - the slow one    Eigen::MatrixXf H = J.transpose() * weight_ * J;    Eigen::VectorXf b = J.transpose() * (weight_ * error);    // obtain delta and update state    del = H.ldlt().solve(b);    T <- T(del)   // this is pseudo code,meaning update T with del}

它位于类中的函数中,现在用于调试目的的权重矩阵被定义为可由函数访问并在调用函数之前定义的类变量.

解决方法 因为矩阵乘法只是对角线,你可以改变它以使用系数乘法,如下所示:

MatrixXd m;VectorXd w;w.setlinSpaced(5,2,6);m.setones(5,5);std::cout << (m.array().rowwise() * w.array().transpose()).matrix() << "\n";

同样,矩阵向量积可以写成:

(w.array() * error.array()).matrix()

这避免了矩阵中的零元素.没有MCVE让我以此为基础,YMMV ……

总结

以上是内存溢出为你收集整理的c – 特征中的矩阵乘法非常慢全部内容,希望文章能够帮你解决c – 特征中的矩阵乘法非常慢所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存