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

为什么在Matlab中,通过sub2ind进行索引与通过A(i,j)进行索引不同?

  •  1
  • euraad  · 技术社区  · 2 年前

    假设你有这个矩阵

    >> P = zeros(8, 12)
    P =
    
       0   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
    

    你想添加 1 在每个坐标上。如果是同一坐标 +1

    >> angles = [1 2 1 3 3 2 5 6 2 1 3 8]
    angles =
    
       1   2   1   3   3   2   5   6   2   1   3   8
    
    >> r = [1 2 4 2 5 6 1 4 6 6 3 6]
    r =
    
       1   2   4   2   5   6   1   4   6   6   3   6
    

    如果我使用 sub2ind

    >> indices = sub2ind(size(P), angles, r);
    >> P(indices) = P(indices) + 1;
    >> P
    P =
    
       1   0   0   1   0   1   0   0   0   0   0   0
       0   1   0   0   0   1   0   0   0   0   0   0
       0   1   1   0   1   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       1   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   1   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   1   0   0   0   0   0   0
    

    但是如果我使用普通索引

    >> for k = 1:length(r)
          P(angles(k), r(k)) = P(angles(k), r(k)) + 1;
       end
    >> P
    P =
    
       1   0   0   1   0   1   0   0   0   0   0   0
       0   1   0   0   0   2   0   0   0   0   0   0
       0   1   1   0   1   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       1   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   1   0   0   0   0   0   0   0   0
       0   0   0   0   0   0   0   0   0   0   0   0
       0   0   0   0   0   1   0   0   0   0   0   0
    

    如果你仔细观察,会发现 2 矩阵内部 P ,但不在矩阵内 P 在上面

    问题:

    为什么 sub2in 索引不同于常规 P(i, j) 索引?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Luis Mendo    2 年前

    产生差异的原因是重复了一对坐标(此处用黑体标记):

    angles = [1 2 1 3 3 𝟐 5 6 𝟐 1 3 8]
    r =      [1 2 4 2 5 𝟔 1 4 𝟔 6 3 6]
    

    sub2ind 版本,重复的坐标对导致 indices 以具有重复的值。线路 P(indices) = P(indices)+1; 仅添加 1 一旦 的条目 P 。这与 ind2sub ,这只是索引赋值的工作方式:更改 不“累积” ,因此重复输入会起作用 论原始价值 ,而不考虑相同条目的先前出现。例如:

    >> x = [10 20 30];
    ind = [2 3 3];
    x(ind) = x(ind)+1
    x =
        10    21    31
    

    或者,也许更清楚地指出 50 在这里是无用的:

    >> x = [10 20 30];
    >> x([2 3 3]) = [40 50 60]
    x =
        10    40    60
    

    另一方面,在 for 版本 显式累加 更改,因此如果一个条目出现两次,则添加 1. 两次 到该条目。