将MATLAB中的spdiags()转换为Python

时间:2015-08-09 01:09:33

标签: python matlab function scipy sparse-matrix

我正在尝试将MATLAB实现转换为Python 3实现。我发现了一个我不理解的函数spdiags(),我也不确定如何将它翻译成Python 3。

关于该函数的MATLAB文档在这里: http://www.mathworks.com/help/matlab/ref/spdiags.html

关于同名函数的Scipy文档在这里: http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.spdiags.html

MATLAB函数有什么作用,是否有相同返回值的Python实现?

3 个答案:

答案 0 :(得分:3)

在Octave(MATLAB替代)中,其文档中的示例:

octave:7> x = spdiags (reshape (1:12, 4, 3), [-1 0 1], 5, 4);
octave:8> full(x)  # display as a full or dense matrix
ans =    
    5   10    0    0
    1    6   11    0
    0    2    7   12
    0    0    3    8
    0    0    0    4

x中存储的实际值为:

x =
Compressed Column Sparse (rows = 5, cols = 4, nnz = 11 [55%])
  (1, 1) ->  5
  (2, 1) ->  1
  (1, 2) ->  10
  (2, 2) ->  6
  (3, 2) ->  2
  (2, 3) ->  11
  (3, 3) ->  7
  (4, 3) ->  3
  (3, 4) ->  12
  (4, 4) ->  8
  (5, 4) ->  4

等效的scipy.sparse表达式:

In [294]: x = sparse.spdiags(np.arange(1,13).reshape(3,4), [-1, 0, 1], 5, 4)
In [295]: x.A   # display as normal numpy array
Out[295]: 
array([[ 5, 10,  0,  0],
       [ 1,  6, 11,  0],
       [ 0,  2,  7, 12],
       [ 0,  0,  3,  8],
       [ 0,  0,  0,  4]])

In [296]: x
Out[296]: 
<5x4 sparse matrix of type '<class 'numpy.int32'>'
    with 11 stored elements (3 diagonals) in DIAgonal format>

这使用dia格式,但很容易使用csc转换为x.tocsc()(相当于Octave格式)。

要查看相同的坐标和值,我们可以使用dok格式(字典子类):

In [299]: dict(x.todok())
Out[299]: 
{(0, 1): 10,
 (1, 2): 11,
 (3, 2): 3,
 (0, 0): 5,
 (3, 3): 8,
 (2, 1): 2,
 (2, 3): 12,
 (4, 3): 4,
 (2, 2): 7,
 (1, 0): 1,
 (1, 1): 6}

相同的值,调整基于0的索引。

在这两种情况下,对角线值来自矩阵:

octave:10> reshape(1:12, 4, 3)
ans =
    1    5    9
    2    6   10
    3    7   11
    4    8   12

In [302]: np.arange(1,13).reshape(3,4)
Out[302]: 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

Octave / MATLAB按行排列值numpy,因此排列reshape numpy矩阵是MATLAB等效矩阵的转置。

请注意,两者都省略了9(映射到3个元素对角线的4个项目)。

另一个参数是要设置的对角线列表,[-1,0,1]和最终形状(5,4)

论证中的大多数差异都必须在MATLAB和numpy之间做出基本的区别。另一个区别是MATLAB只有一个稀疏矩阵表示,scipy只有一半。

答案 1 :(得分:1)

嗯,这个答案只能划伤表面,但是:

对于矩阵,存在不同的存储格式。当然,有最直观的“一排一排”和“一列又一列”格式,但也有一些只有少数非零条目的矩阵格式,这当然可以节省大量内存(并且可以节省大量的内存) CPU)如果使用得当。

因此,这些对角稀疏矩阵就是matlab中特殊存储矩阵的情况;如果您不关心计算优势,只需使用diag,它在功能上是100%等效的(但不生成稀疏矩阵)。

稀疏矩阵存储的存在是一个Matlab特性,而scipy实际上(我实际上对此感到惊讶)也有这个特性。如果符合您的需要,请使用scipy方法!

答案 2 :(得分:1)

对此我有一个解决方案,尝试起来非常简单,您会从MATLAB和python得到相同的答案,通过python,有时您必须更改输入格式。

所以尝试一下:

sparse.spdiags(your_Array.T, diags, m, n)