У меня есть программа, которая читает данные в формате:
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 для создания разреженной матрицы из моих входных данных (при условии, что я уже прочитал ее). Мне также не повезло выяснить, как на самом деле вернуть значение, относящееся к паре (строка, столбец), используя разреженную матрицу наддува. Кто-нибудь может указать мне некоторые основные примеры или объяснить, как я могу это сделать?
Спасибо за любую помощь, которую вы можете предоставить.
Существует несколько видов реализации разреженных матриц в 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
Других решений пока нет …