Я не знаком с вашими пакетами, но почему вы (в идеале) должны указывать количество ненулевых элементов в вашей матрице? Вы не можете переопределить, а затем уменьшить в размере?
Меня также смущает, почему добавление столбцов стоит так дорого. Разреженный формат должен быть в состоянии справиться с этим. Я бы пришел к выводу, что происходит одна из двух вещей. Либо ваша матрица каким-то образом преобразуется в не разреженную матрицу перед обратным преобразованием (кажется ужасной и невозможной в любом приличном пакете с разреженной матрицей), либо код для вставки является квадратичным, поскольку он многократно вставляет значения, сдвигаясь по всем остальным каждый время.
Последнее кажется вероятным. Я попытался бы свернуть свой собственный код «вставить столбец», который принимает текущую разреженную матрицу, вычисляет, сколько еще записей, выделяет больший блок и копирует последовательно, вставляя новые столбцы по мере продвижения. Это линейно и должно быть по существу мгновенным. Я не знаю, достаточно ли этого для решения всей проблемы, но это должно быть началом.
Кроме того, если в матрице порядка 25 тыс. Записей, нет разумного ответа на вопрос, почему ее копирование или транспонирование должно занимать более пары миллисекунд. Я думаю, что вам нужно сравнить отдельные части этой проблемы и действительно точно определить, куда уходит время, если только вышеприведенное решение по добавлению столбцов не решит вашу проблему.