c – 特征中的矩阵乘法非常慢
我已经实现了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 …… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |