для матрицы 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]
Используйте два выхода 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
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
.
Матлаб – странное и загадочное место. При поиске в документации я нашел функцию, называемую 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]);