代码之家  ›  专栏  ›  技术社区  ›  Carpetfizz

无法在MATLAB中再现Numpy样式的索引

  •  3
  • Carpetfizz  · 技术社区  · 6 年前

    下面是我试图在MATLAB中重现的Python代码。

    >>> M = np.zeros((5,5))
    >>> indices = np.arange(5)
    >>> M[indices[:-1], indices[:-1]+1] = 1
    >>> print(M)
    [[0. 1. 0. 0. 0.]
     [0. 0. 1. 0. 0.]
     [0. 0. 0. 1. 0.]
     [0. 0. 0. 0. 1.]
     [0. 0. 0. 0. 0.]]
    

    下面是我在MATLAB中编写它时发生的情况。

    >> M = zeros(5);
    >> indices = 1:5;
    >> M(indices(1:end-1), indices(1:end-1)+1) = 1
    >>
    M =
    
         0     1     1     1     1
         0     1     1     1     1
         0     1     1     1     1
         0     1     1     1     1
         0     0     0     0     0
    

    1 回复  |  直到 6 年前
        1
  •  3
  •   rahnema1    6 年前

    Matlab2D索引提取一个矩形子矩阵,该子矩阵的行和列根据提供的索引向量重新排序。但是,如果您有一个行和列的列表,并且想要提取相应的元素,那么您应该将2D索引转换为线性索引,并且可以使用 sub2ind :

    M = zeros(5);
    indices = 1:5;
    idx = sub2ind([5,5],indices(1:end-1), indices(1:end-1)+1);
    M(idx) = 1
    

    或者,可以直接使用线性索引:

    M = zeros(5);
    M(5+1:5+1:end) = 1
    

    线性索引是如何工作的?

    1    6   11   16   21
    2    7   12   17   22
    3    8   13   18   23
    4    9   14   19   24
    5   10   15   20   25
    

    使用靶场时 6:6:end 这意味着您希望以步长为6的formelement6开始提取元素,以便 [6 12 18 24] . 这种索引方案可以推广到ND阵列和非方矩阵。