Я построил разреженную матрицу mat
из списка триплетов
Eigen::SparseMatrix<double, Eigen::RowMajor> mat(Nbins,Ndata);
mat.setFromTriplets(tripletList.begin(), tripletList.end());
Теперь я хотел бы создать новую матрицу ret
, которая содержит только строки предыдущей матрицы, которыене пустой.Я делаю это следующим образом
Eigen::SparseMatrix<double, Eigen::RowMajor> ret(Nbins,Ndata);
unsigned Nrow=0;
for (unsigned i=0; i<Nbins; ++i) {
auto mrow = mat.row(i);
if (mrow.sum()>0) {
ret.row(Nrow++) = mrow;
}
}
ret.conservativeResize(Nrow,Ndata);
Однако делать это медленно и неэффективно.Медленный, потому что быстрое профилирование предполагает, что он проводит большую часть своего времени на ret.row(Nrow++) = mrow;
.Неэффективно, потому что мы также копируем все данные дважды.
Есть ли лучшее решение?Я чувствую, что нужно возиться с внутренними векторами, но они меня смущают, и я не знаю, насколько это удобно для пользователя, играть с ними.
РЕДАКТИРОВАТЬ: В моем приложении матрицы являются основными рядами,и я хочу удалить пустые строки.mat
не нужен, просто ret
.Все коэффициенты положительны, поэтому я проверяю ненулевые строки.Триплеты отсортированы, но по столбцу.Там нет дубликатов триплетов.