У меня очень большая матрица (например, 10000x10000) для хранения в файле. Очевидно, что для этого требуется довольно много бесполезной памяти, поскольку в ней много нулей.

В википедии я нашел способ хранить такую ​​матрицу:

https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format)

Мне удалось связать три массива с матрицей. Но теперь я хочу сделать обратное: учитывая эти три массива, я хотел бы восстановить исходную матрицу. Я знаю, в какой столбец я должен поместить элементы в массиве A (ну, он указан в массиве JA), но я не знаю, в какой строке я должен их разместить.

Любая помощь, пожалуйста?

Большое спасибо.

2
johanDa9u 7 Дек 2018 в 02:11

1 ответ

Лучший ответ

Чтобы определить, в какую строку их поместить, вам нужно использовать IA и A.

Работайте в обратном направлении и рассчитайте список

IA' = {IA[m+1] - IA[m], IA[m] - IA[m-1], IA[m-1] - IA[m-2],..., IA[2]-IA[1], IA[1]-IA[0]}

Список IA 'сообщит вам, сколько элементов A добавить в нижнюю строку матрицы.

Вы уже знаете, куда их добавить, используя J.

Так

IA' = [4-3, 3-2, 2-0, 0]
IA' = [1,1,2,0] 

Для примера из Википедии, указанного ниже:

   A  = [5,8,3,6]
   IA = [0,0,2,3,4]
   JA = [0,1,2,1]

Это означает, что последний элемент A идет в нижнем ряду, предпоследний идет в строке выше, а первые 2 элемента A идут в 3-м ряду вверх. В верхнем ряду нет записей.

Изменение IA на IA может упростить реализацию, поскольку вместо этого вы можете работать со строками и интерпретировать это следующим образом:

IA'' = [0,2,1,1]
A    = [5,8,3,6]

В верхней строке 0 записей. в следующей строке 2 записи [5,3]. следующие 2 имеют по 1 записи, [3] и [6] соответственно.

2
toastedDeli 7 Дек 2018 в 00:13