Я хочу протестировать некоторые из новых разреженных линейных решателей и узнать, есть ли быстрый способ заполнения матрицы. Меня интересует формат CSR (http://goo.gl/hLXYd). Допустим, матрица в формате CSR имеет вид:
values(num non-zero elements)
columns(num non-zero elements)
rowIndex(num rows + 1)
Рассматриваемая разреженная матрица происходит от сетей. Итак, у меня есть тысячи узлов, и некоторые из них связаны между собой линиями. Итак, матрица структурно симметрична. Каждое соединение (i,j) добавляет что-то к диагональным членам (i,i) и (j,j) и к недиагональным (i,j) и (j,i). У меня может быть несколько соединений между одними и теми же узлами (i, j, 1), (i, j, 2)... Таким образом, мне может потребоваться повторно посетить 2 диагональных и 2 недиагональных элемента более одного раза.
Я знаю, что могу получить начало строки, выполнив rowIndex(i). Затем мне пришлось бы просмотреть столбцы элементов (rowIndex (i): rowIndex (i + 1) -1), чтобы найти, где находится j.
Вопрос:
Есть ли способ более быстрого доступа к элементам в формате CSR без необходимости выполнять поиск каждый раз, когда я хочу обновить элемент?
Некоторые уточнения: мне просто нужно заполнить матрицу с нуля. Матрица структурно симметрична и не совсем симметрична. Сохраненные значения относятся к сетевым данным (импедансы, сопротивления и т. д.), они имеют реальные значения. В общем случае Значение(i,j)‹>Значение(j,i). У меня есть кортежи вида (name1,i1,j1,value1), (name2,i2,j2,value2) и т. д. Эти кортежи не отсортированы, и 2 кортежа могут ссылаться на одни и те же значения i,j, что означает, что они должны быть добавленным
Заранее спасибо!