当前位置: 首页 > 知识库问答 >
问题:

将MATLAB中的spdiags()转换为Python

敖永丰
2023-03-14

我正在尝试将一个MATLAB实现转换为一个Python3实现。我发现一个函数spdiags(),我不理解,也不知道如何将它翻译成Python3。

有关该函数的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实现可用?

共有1个答案

姜博
2023-03-14

在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格式,但使用x.tocsc()很容易转换为csc(相当于倍频程格式)。

要查看相同的坐标和值,我们可以使用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按行排列值,因此不同的reshapenumpy矩阵是MATLAB等价物的转置。

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

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

大部分参数的差异都要做MATLAB和NUMPY的基本区别。另一个区别是,MATLAB只有一个稀疏矩阵表示,scipy有半打。

 类似资料:
  • 问题内容: 好的,所以我有一个来自EEG扫描的数据文件(一个二进制文件,data.eeg),在matlab中,用于读取文件并绘制部分数据的代码如下所示: 这是我的“翻译”尝试 这就是让我感到困惑的地方。根据文档,matlab的fread是一种通过fread(loaded_file,size,data_type)读取二进制文件的方法。python中的替代方法是使用numpy的fromfile并使用内

  • 问题内容: 我刚开始从Matlab迁移到Python 2.7,但在读取.mat文件时遇到一些麻烦。时间信息以Matlab的datenum格式存储。对于那些不熟悉它的人: 序列号代表日历日,表示自固定基准日期起已过去的天数。在MATLAB中,序列号1为0000年1月1日。 MATLAB还使用串行时间表示从午夜开始的几分之一秒。例如,下午6点等于0.75个连续日。因此,MATLAB中的字符串‘31 -

  • 主要内容:拉普拉斯变换,逆拉普拉斯变换,傅里叶变换,逆傅里叶变换MATLAB提供了处理转换的命令,如拉普拉斯和傅里叶变换。转换在科学和工程中被用作简化分析和从另一个角度看待数据的工具。 例如,傅里叶(Fourier)转换允许我们将表示为时间的函数的信号转换为频率的函数。 拉普拉斯变换允许我们将微分方程转换为代数方程。 MATLAB提供了,和命令来处理拉普拉斯,傅立叶和快速傅里叶转换。 拉普拉斯变换 时间函数的拉普拉斯转换由以下积分 - 拉普拉斯变换也表示为到的

  • 将编码传递到UTF-8后,我无法在Windows-1252中显示字符串。 我被迫在init中转换为UTF-8 我想将我的字符串转换为Windows-1252字符以显示它: 我正在得到这个结果 如何获得正确的以下结果? 谢谢! 当做

  • 我是Matlab新手,所以这应该是一个简单的问题。我有一个带有几个特定像素的图像,我需要从中获取红色RGB分量,求和,并将结果存储到一个变量中。默认情况下,这些值的类型为uint8,因此总和不能超过255。我尝试使用double()的每个组合将R值转换为double,但似乎没有任何效果。下面是从终端复制的实际情况:(所有像素的R值都在200以上) 我做错了什么?我不能将这些值转换为双精度值吗?

  • 问题内容: 我正在寻找一种将NumPy数组传递给Matlab的方法。 我已经设法通过使用将数组存储到图像中,然后使用加载它来做到这一点,但这当然会使矩阵包含0到256之间的值,而不是“真实”值。 将这个矩阵的乘积除以256,再加上原始NumPy数组中的最大值,可以得出正确的矩阵,但是我觉得这有点乏味。 有没有更简单的方法? 问题答案: 当然,只要使用 举个例子: 同样,有。 然后,您使用将其加载到