Matlab: Как заменить некоторые элементы матрицы A на другие значения A в обоих направлениях?

Вопрос:

для матрицы A (10×100000), содержащей числа от 1 до 100, как заменить некоторые элементы A на другие значения A в обоих направлениях?

пример:

заменить номера [5 7 9 18 55 4] на [47 78 41 1 99 98] и [47 78 41 1 99 98] на [5 7 9 18 55 4]

Ответ №1

Используйте два выхода ismember:

n1 = [1 2 3]; %// first set of numbers
n2 = [4 5 6]; %// second set of numbers
[v1, i1] = ismember(A,n1);
[v2, i2] = ismember(A,n2);
A(v1) = n2(i1(v1));
A(v2) = n1(i2(v2));

Пример:

>> A = randi(8,4,5)
A =
2     2     8     4     6
2     5     3     8     2
5     4     3     2     5
4     3     2     3     4

преобразуется в

A =
5     5     8     1     3
5     2     6     8     5
2     1     6     5     2
1     6     5     6     1

Ответ №2

bsxfun

%// Input matrix
A = randi(100,10,10)

vec1 = [5 7 9 18 55 4 , 47 78 41 1 99 98]; %// Numbers to be replaced
vec2 = [47 78 4 1 99 98, 5 7 9 18 55 4]; %// Numbers to be used as replacements

[v1,v2] = max(bsxfun(@eq,A(:),vec1),[],2);
A(find(v1)) = vec2(v2(v1))

Пример прогона –

Вход A

A =
27    37    27    59    37    13    55    45    29    16
84    41    58    46    75    39    75    51    49    16
100    37    88    87    71    82    85    54    69    16
65    47     7    67    71    99    17    86    21     9
71    51    45    36     1    87    91    68    61    46
94    92     9    35    38     9    11    81    33    67
69    21    57    26    91    34    75    54    89    84
57    34    54    96    32    24    73    96    14    80
39    58    77    30    60    32    72     7    11    72
64    49    24    16    30    99    14    55    96    48

Выход A

A =
27    37    27    59    37    13    99    45    29    16
84     9    58    46    75    39    75    51    49    16
100    37    88    87    71    82    85    54    69    16
65     5    78    67    71    55    17    86    21     4
71    51    45    36    18    87    91    68    61    46
94    92     4    35    38     4    11    81    33    67
69    21    57    26    91    34    75    54    89    84
57    34    54    96    32    24    73    96    14    80
39    58    77    30    60    32    72    78    11    72
64    49    24    16    30    55    14    99    96    48

Как можно видеть, 7s из (4,3) и (9,8) в оригинале A заменяются на 78s и 47 в (4,2) на 5.

Ответ №3

Матлаб – странное и загадочное место. При поиске в документации я нашел функцию, называемую changem в панели инструментов “Сопоставление”. Я никогда не использовал его, но, видимо, если у вас есть исходная матрица A и два вектора подстановки v1 and v2:

v1 = [ 5  7  9 18 55  4];
v2 = [47 78 41  1 99 98];

Все, что вам нужно сделать, это:

B = changem(A, [v1 v2], [v2 v1]);

Оцените статью
TechArks.Ru
Добавить комментарий