используйте boost для построения и доступа к значениям в разреженной матрице

У меня есть программа, которая читает данные в формате:

Row    Column    Value
1      1         4
1      3         5
2      1         6
...

где первые два столбца относятся к индексам матрицы, а столбец значений содержит значение, сохраненное по этой координате (строка, столбец) в матрице.

Если бы я на самом деле построил 2d массив для представления матрицы, он был бы очень большим, так как мои входные данные очень скудны. Вместо этого я хочу построить разреженное матричное представление, которое позволит мне найти значение, соответствующее паре (строка, столбец), возвращая 0, если его нет.

Кажется, что у Boost есть способ сделать это, но я не могу найти достаточно документации, чтобы понять, как ее использовать.

Я прочитал их подробно, но все еще не уверен, как действовать:

http://www.guwi17.de/ublas/doc/html/ex__fill1_8cpp-source.html
http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/matrix_sparse.htm

Я новичок в C ++, поэтому не уверен, как использовать boost для создания разреженной матрицы из моих входных данных (при условии, что я уже прочитал ее). Мне также не повезло выяснить, как на самом деле вернуть значение, относящееся к паре (строка, столбец), используя разреженную матрицу наддува. Кто-нибудь может указать мне некоторые основные примеры или объяснить, как я могу это сделать?

Спасибо за любую помощь, которую вы можете предоставить.

0

Решение

Существует несколько видов реализации разреженных матриц в boost: mapped_matrix (поддерживается ассоциативным контейнером, таким как std::map), compressed_matrix а также coordinate_matrix (поддерживается массивами изменяемого размера). Использование одинаково для всех из них.

Вот некоторые основы для сжатой матрицы:

#include <iostream>
#include <sstream>
#include <boost/numeric/ublas/matrix_sparse.hpp>

namespace ublas = boost::numeric::ublas;
int main()
{
ublas::compressed_matrix<int> m(10, 10); // 10x10 compressed matrix

// replace by ifstream in("filename") in real code
std::istringstream in("1      1         4\n""1      3         5\n""2      1         6\n");

// read from stream
int val;
for(size_t r,c; in >> r >> c >> val; )
m(r,c) = val;

// print out
for(size_t i = 0; i < m.size1(); ++i)
{
for(size_t j = 0; j < m.size2(); ++j)
std::cout << m(i,j) << ' ';
std::cout << '\n';
}

// info on the storage
std::cout << "Non-zeroes: " << m.nnz() << '\n'
<< "Allocated storage for " << m.nnz_capacity() << '\n';

}

онлайн демо: http://liveworkspace.org/code/2iCZuF

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]