перекодирование элементов многомерного массива в Matlab - PullRequest
0 голосов
/ 26 марта 2019

Есть ли эффективный способ перекодировать элементы многомерного массива в Matlab без необходимости перекодировать каждый элемент по одному?

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

r = [11,22,33,44]

Например, как я могу перекодировать ненулевойэлементы m с использованием значений в r (то есть 1=11, 2=22, 3=33 и 4=44).

Ответы [ 2 ]

1 голос
/ 27 марта 2019
>> 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
1 голос
/ 26 марта 2019

Это должно быть довольно просто, используя оператор :, см. Следующий код. Предположение: значения в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...