Рассмотрим пример A=[1,2,3,2,5,6,2]
. Вы хотите найти индексы, где встречается 2
, и получить все возможные перестановки этих индексов.
Для первого шага используйте unique
в сочетании с histc
, чтобы найти повторяющийся элемент и индексы, где он встречается.
uniqA=unique(A);
B=histc(A,uniqA);
Вы получаете B=[1 3 1 1 1]
. Теперь вы знаете, какое значение в uniqA
повторяется и сколько раз. Чтобы получить индексы,
repeatIndices=find(A==uniqA(B==max(B)));
, что дает индексы как [2, 4, 7]
. Наконец, для всех возможных перестановок этих индексов используйте функцию perms
.
perms(repeatIndices)
ans =
7 4 2
7 2 4
4 7 2
4 2 7
2 4 7
2 7 4
Я верю, что это делает то, что вы хотели. Вы можете написать функцию-оболочку для всего этого, чтобы у вас было что-то компактное, например out=sort_ties(in)
. Скорее всего, вы должны включить условное выражение вокруг строки repeatIndices
, чтобы, если B
было всеми единицами, вы не продвигались дальше (то есть связи отсутствуют)