Как часть более крупной проблемы, я сталкиваюсь с горлышком бутылки производительности при работе с разреженными матрицами в Эйгене.Узкое место производительности в программе Eigen
Мне нужно вычесть число с плавающей запятой (x
) из каждого элемента в разреженной матрице (G
), включая позиции, где коэффициенты равны нулю. Таким образом, нулевые элементы должны иметь значение -x
так, как я это на данный момент выглядит следующим образом:
//calculate G
x=0.01;
for(int i=0;i<rows;i++){
for (int j=0; j<cols; j++) {
G.coeffRef(i, j) -= x;
}
}
Когда размер G велик, это простой расчет является узким местом.
Я также попытался преобразовать разреженную матрицу G в плотную один и вычитает P (матрица заполняется значениями х):
MatrixXd DenseG=MatrixXd(G);
x=0.01;
for(int i=0;i<rows;i++){
for (int j=0; j<cols; j++) {
DenseG(i, j) -= x;
}
}
Этот метод намного быстрее. Тем не менее, мне просто интересно, есть ли другие обходные пути, которые не связаны с преобразованием G в плотный, что требует большой памяти в случае очень больших матриц.