【问题标题】:re-coding elements of multidimensional array in matlab在matlab中重新编码多维数组的元素
【发布时间】:2019-03-26 19:51:14
【问题描述】:

有没有一种有效的方法可以在 Matlab 中对多维数组的元素进行重新编码,而不必对每个元素一个一个地重新编码?

m=[1,2,0;3,4,0]
m(:,:,2)=[2,0,1;0,4,3]

r = [11,22,33,44]

例如,如何使用r 中的值(即1=112=223=334=44)重新编码m 的非零元素。

【问题讨论】:

    标签: matlab multidimensional-array


    【解决方案1】:
    >> m(m~=0) = r(nonzeros(m))
    m =
    
    ans(:,:,1) =
    
       11   22    0
       33   44    0
    
    ans(:,:,2) =
    
       22    0   11
        0   44   33
    

    解释:

    (m~=0) 为我们提供了逻辑索引(与m 相同的形状),它决定了m 中的哪些元素要分配给:

    >> m~=0
    ans =
    
    ans(:,:,1) =
    
      1  1  0
      1  1  0
    
    ans(:,:,2) =
    
      1  0  1
      0  1  1
    

    nonzeros(m) 为我们提供m 的非零元素,用作r 中的索引,其顺序与分配到左侧的顺序相同:

    >> nonzeros(m)
    ans =
    
       1
       3
       2
       4
       2
       4
       1
       3
    

    【讨论】:

      【解决方案2】:

      使用: 运算符应该很容易,请参见以下代码。假设:m 中的值始终对应于r 中的索引。我稍微修改了示例输入,以便您看到,在r 中没有相应索引的值(很可能是m(i) > numel(r))被省略了。

      % Slightly modified input.
      m = [1, 2, 0; 3, 4, 0];
      m(:, :, 2) = [2, 0, 1; 0, 5, 3]
      
      % Recode vector.
      r = [11, 22, 33, 44];
      
      % Get indices in m which correspond to recode elements.
      idx = ((m(:) > 0) & (m(:) <= numel(r)));
      
      % Recode elements in m.
      m(idx) = r(m(idx))
      

      输出:

      m =
      
      ans(:,:,1) =
      
         1   2   0
         3   4   0
      
      ans(:,:,2) =
      
         2   0   1
         0   5   3
      
      m =
      
      ans(:,:,1) =
      
         11   22    0
         33   44    0
      
      ans(:,:,2) =
      
         22    0   11
          0    5   33
      

      【讨论】:

        猜你喜欢
        • 2014-11-23
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 1970-01-01
        相关资源
        最近更新 更多