Чтение формата Matrix Market блочной системы в Python - PullRequest
0 голосов
/ 17 апреля 2020

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

---------------
| A_00 | A_01 |
---------------
| A_10 | A_11 |
---------------

Тогда у меня есть код, выводящий четыре файла, A_00.mm, A_01.mm, A_10.mm и A_11.mm для каждого блока соответственно. Сейчас я пытаюсь объединить их в Python, чтобы выполнить некоторый анализ (собственные значения и c). Проблема в том, что формат Matrix Market не очень хорошо выстраивается. Например, мой A_00.m будет выглядеть так:

# A_00.mm file
%%MatrixMarket matrix coordinate real general
%% A_00
%% v-v
648 648 92724
1 1 1.00000000000000000e+00
1 2 0.00000000000000000e+00
1 3 0.00000000000000000e+00
1 4 0.00000000000000000e+00
[...]
648 645 0.00000000000000000e+00
648 646 0.00000000000000000e+00
648 647 0.00000000000000000e+00
648 648 1.00000000000000000e+00

Но тогда мой A_01 запустится так:

# A_01.mm file
%%MatrixMarket matrix coordinate real general
%% A_01
%% v-p
648 216 31284
1 649 0.00000000000000000e+00
1 650 0.00000000000000000e+00
1 651 0.00000000000000000e+00
[...]

Он хранит индекс так, как если бы он был в большой системе блоков. Из-за этого использование scipy.io.mmread дает ошибку, т.е.

/usr/local/lib/python3.7/site-packages/scipy/sparse/coo.py in _check(self)
    283         if self.nnz > 0:
    284             if self.row.max() >= self.shape[0]:
--> 285                 raise ValueError('row index exceeds matrix dimensions')
    286             if self.col.max() >= self.shape[1]:
    287                 raise ValueError('column index exceeds matrix dimensions')

ValueError: row index exceeds matrix dimensions

Я имею в виду, что мог бы сам написать читателя, но есть ли менее болезненный способ обойти это?

...