повысить основы сжатой матрицы - PullRequest
7 голосов
/ 22 сентября 2010

Я запутался в том, как работает boost :: compress_matrix.Предположим, я объявляю сжатую матрицу следующим образом:

boost::numeric::ublas::compressed_matrix<double> T(1000, 1000, 3*1000);

Это выделяет пространство для 3 * 1000 элементов в матрице 1000x1000.Теперь, как я могу дать ему места, которые являются ненулевыми элементами?Когда и как устанавливаются ненулевые элементы?Каждый раз, когда я назначаю элемент в матрице, например, B (4,4) = 4, он будет помечать этот элемент как ненулевой?

Я был бы очень признателен, если бы вы могли помочь мне узнать это на примере, если это возможно.Некоторое понимание внутренней реализации было бы здорово.Я хочу убедиться, что я не пишу программы, которые являются неоптимальными по предположениям.

спасибо!

Ответы [ 2 ]

3 голосов
/ 22 сентября 2010
Сжатая матрица

имеет базовый линейный контейнер (по умолчанию unbounded_array, но вы можете сделать его bounded_array или std::vector, если хотите), который содержит все ненулевые элементы матрицы в мажорной строкепо умолчанию) заказ.Это означает, что всякий раз, когда вы записываете новый ненулевой элемент в сжатую матрицу, он вставляется в этот базовый массив.Если вы не заполняете матрицу в порядке (основной ряд), каждая вставка будет O (n).Когда вы меняете существующий ненулевой элемент, он просто изменяется в базовом массиве.

Вот простой тест, чтобы увидеть, как выглядит базовая структура:

#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/storage.hpp>
namespace ublas = boost::numeric::ublas;
void show_array(const ublas::unbounded_array<double>& a)
{
    for(size_t i=0; i<a.size(); ++i)
            std::cout << a[i] << ' ';
    std::cout << '\n';
}
int main()
{
    ublas::compressed_matrix<double> m (10, 10, 3 * 10);
    m(0, 5) = 1; // underlying array is {1, 0, 0, 0, ...}
    show_array(m.value_data());
    m(0, 6) = 2; // underlying array is {1, 2, 0, 0, ...}
    show_array(m.value_data());
    m(0, 4) = 3;  // underlying array is {3, 1, 2, 0, ...}
    show_array(m.value_data());
    m(0, 4) = 7;  // underlying array is {7, 1, 2, 0, ...}
    show_array(m.value_data());
}
1 голос
/ 22 сентября 2010

вы можете использовать оператор (i,j) для неявного создания ненулевого элемента или использовать функцию insert_element для явной вставки элемента.

На самом деле лучше всего заглянуть внутрь реализации:

http://www.tena -sda.org / doc / 5.2.2 / boost / d2 / db7 / matrix__sparse_8hpp-source.html # l02761

true_reference insert_element (size_type i, size_type j, const_reference t)

Вставляет значение t в j-й элемент i-й строки.Дубликаты элементов недопустимы.


void erase_element (size_type i, size_type j)

Стирает значение в j-м элементе i-й строки.

...