Функция Matlab Sparse vs Python Scipy.sparse library - PullRequest
1 голос
/ 26 января 2020

Я перевожу код Matlab в среду Python, и теперь работаю с разреженной функцией в Matlab. Я знаю, что у нас есть библиотека с именем scipy.sparse и одна из них такая, что csc_matrix((data, (row_ind, col_ind)), [shape=(M, N)]).

Однако, когда я проверяю библиотеки, вычисленные из библиотеки scipy.sparse, они не совпадают с библиотекой из Matlab , У меня большие данные размером 1693872, которые называются Ig (1693872,), Jg (1693872,) и K_dummy (1693872,), где K_dummy(Ig(i),Jg(i)) = K_dummy(i).

Я уже проверил все переменные, Ig, Jg, K_dummy с Matlab и отлично соответствует. Ребята, вы понимаете, что я должен рассмотреть другие аспекты?

Вот мой пример кода в python и Matlab соответственно в качестве ссылок:

K = csc_matrix((K_dummy.flatten('F'),(Ig.flatten('F')-1,Jg.flatten('F')-1)),shape=(noDofs,noDofs))

K = sparse(Ig(:),Jg(:),K_dummy_python(:),noDofs,noDofs);

, где K_dummy - это (18, 18, 5228) массив, Ig это массив (324, 5228), Jg это (324, 5228) массив, и noDofs это переменная типа int как 42442.

1 Ответ

0 голосов
/ 26 января 2020

В Октаве:

>> data=[1,2;3,4];
>> I=[1,2,3,4];
>> J=[2,3,4,2];
>> M = sparse(I(:),J(:),data(:))
M =

Compressed Column Sparse (rows = 4, cols = 4, nnz = 4 [25%])

  (1, 2) ->  1
  (4, 2) ->  4
  (2, 3) ->  3
  (3, 4) ->  2

>> full(M)
ans =

   0   1   0   0
   0   0   3   0
   0   0   0   2
   0   4   0   0

>> save -7 sparse1.mat data I J M

В numpy с scipy.io и scipy.sparse:

In [57]: d = loadmat('sparse1.mat')                                                              
In [58]: d                                                                                       
Out[58]: 
{'__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.2.2, 2020-01-26 19:36:04 UTC',
 '__version__': '1.0',
 '__globals__': [],
 'data': array([[1., 2.],
        [3., 4.]]),
 'I': array([[1., 2., 3., 4.]]),
 'J': array([[2., 3., 4., 2.]]),
 'M': <4x4 sparse matrix of type '<class 'numpy.float64'>'
    with 4 stored elements in Compressed Sparse Column format>}

И, глядя на разреженную матрицу:

In [59]: d['M'].A                                                                                
Out[59]: 
array([[0., 1., 0., 0.],
       [0., 0., 3., 0.],
       [0., 0., 0., 2.],
       [0., 4., 0., 0.]])
In [60]: print(d['M'])                                                                           
  (0, 1)    1.0
  (3, 1)    4.0
  (1, 2)    3.0
  (2, 3)    2.0

И воссоздание матрицы

In [61]: M1 = sparse.csc_matrix((d['data'].flatten('F'), 
                (d['I'].astype(int).flatten('F')-1, 
                 d['J'].astype(int).flatten('F')-1)))                                                        
In [62]: M1                                                                                      
Out[62]: 
<4x4 sparse matrix of type '<class 'numpy.float64'>'
    with 4 stored elements in Compressed Sparse Column format>
In [63]: M1.A                                                                                    
Out[63]: 
array([[0., 1., 0., 0.],
       [0., 0., 3., 0.],
       [0., 0., 0., 2.],
       [0., 4., 0., 0.]])
In [64]: print(M1)                                                                               
  (0, 1)    1.0
  (3, 1)    4.0
  (1, 2)    3.0
  (2, 3)    2.0

С более новым numpy/scipy мне пришлось преобразовать индексы в целое число (они стали более разборчивыми в отношении чисел с плавающей точкой как индексов). Но выравнивание, кажется, работает нормально.

У вас есть добавленное измерение во всех этих переменных, которое мне было лень воссоздавать. Правильное выравнивание может стать причиной ваших проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...