Схема хранения матрицы Ublas
Это не ошибка, но меня смущает схема хранения типичной матрицы UBLAS Boost. Например, я создаю пример матрицы
int pp[] = {0, 2, 5, 8, 12, 16, 19};
int pi[] = {0, 4, 0, 1, 5, 1, 2, 3, 0, 2, 3, 4, 1, 3, 4, 5, 1, 4, 5};
double val[] = {10, -2, 3, 9, 3, 7, 8, 7, 3, 8, 7, 5, 8, 9, 9, 13, 4, 2, -1};
matrix<double> M1(6, 6);
noalias(M1) = zero_matrix<double>(6, 6);
for(int i = 0; i < 6; ++i)
for(int j = pp[i]; j < pp[i+1]; ++j)
M1(i, pi[j]) = val[j];
Затем сделать указатель сжатой_матрицы на плотную матрицу
const compressed_matrix<double>& C1 = M1;
Распечатав внутренние данные указателя сжатой_матрицы, я получил именно триплет сжатой_матрицы. Как это может быть? Является ли это схемой хранения типичной плотной матрицы убласа с использованием сжатой разреженной схемы?
std::cout << "C1.filled1: " << C1.filled1() << std::endl;
std::cout << "C1.index1_data().size(): " << C1.index1_data().size() << std::endl;
std::cout << "index1_data: ";
std::copy(C1.index1_data().begin(), C1.index1_data().end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::cout << "C1.filled2: " << C1.filled2() << std::endl; // this is the correct number of nonzeros of the matrix, not C1.index2_data().size()
std::cout << "C1.index2_data().size(): " << C1.index2_data().size() << std::endl;
std::cout << "index2_data: ";
std::copy(C1.index2_data().begin(), C1.index2_data().end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
Результаты для справки:
C1: [6,6]((10,0,0,0,-2,0),(3,9,0,0,0,3),(0,7,8,7,0,0),(3,0,8,7,5,0),(0,8,0,9,9,13),(0,4,0,0,2,-1))
C1.filled1: 7
C1.index1_data().size(): 7
index1_data: 0 2 5 8 12 16 19
C1.filled2: 19
C1.index2_data().size(): 24
index2_data: 0 4 0 1 5 1 2 3 0 2 3 4 1 3 4 5 1 4 5 0 0 0 0 0