在Matlab中重新编码多维数组的元素

时间:2019-03-26 19:51:14

标签: matlab multidimensional-array

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

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

r = [11,22,33,44]

例如,如何使用m(即r1=112=22和{ {1}}。

2 个答案:

答案 0 :(得分:1)

使用:运算符应该很容易,请参见以下代码。假设: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

答案 1 :(得分: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