Ваше представление матрицы неэффективно: оно не использует тот факт, что матрица разрежена. Я говорю так, потому что он включает в себя все строки матрицы, даже если большинство из них равны нулю (пусто), как это обычно происходит с разреженными матрицами.
С вашим представлением также сложно работать. Поэтому я предлагаю сначала преобразовать представление (в обычный двумерный массив), транспонировать матрицу и выполнить обратное преобразование.
(ред :)
В качестве альтернативы вы можете изменить представление, например, так:
Ввод: rowInd colInd num
1 1 1
1 2 2
1 2 3
2 1 4
2 2 5
2 3 6
3 1 7
3 2 8
3 3 9
Выход:
1 1 1
2 1 2
3 1 3
1 2 4
2 2 5
3 2 6
1 3 7
2 3 8
3 3 9
Код будет выглядеть примерно так:
struct singleElement {int row, col; double val;};
list<singleElement> matrix_input, matrix_output;
...
// Read input matrix from file or some such
list<singleElement>::const_iterator i;
for (i = matrix_input.begin(); i != matrix_input.end(); ++i)
{
singleElement e = *i;
std::swap(e.row, e.col);
matrix_output.push_back(e);
}