当我没有添加权重矩阵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 – 特征中的矩阵乘法非常慢所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)