2015-06-08 2 views
1

Я использую Matlab R2014a, и я хочу узнать, отличаются ли числа из массива друг от друга или нет. Конечно, я могу сделать это в цикле, но я думаю, что для этого есть лучшие способы (например, функции Matlab).Как определить, все ли значения в массиве разные, в Matlab

Пример:

Если

A=[4 6 8 3] => msgbox ('Elements are different') 

и если

A=[4 4 8 3] => msgbox ('Elements are not different'). 

Есть ли функция, чтобы сделать это, или мне нужно сделать это с помощью грубой силы?

ответ

5

Вот несколько альтернатив unique.

В результате любого из следующих true все элементы A отличаются друг от друга, и false в противном случае.

  • Сортировать элементы и посмотреть, если некоторые последовательные элементы равны:

    result = all(diff(sort(A(:)))~=0); 
    
  • Compute расстояние для всех пар элементов, за исключением самостоятельных пар, и посмотреть, если какой-либо равен нулю:

    result = ~any(pdist(A(:))==0); 
    
  • Сравните каждую пару элементов, включая пары-пары, и проверьте, не совпадает ли число совпадений только с числом пар-пар:

    result = nnz(bsxfun(@eq, A(:), A(:).'))==numel(A); 
    
  • Использование ismember (второй выход) для определения наименьшей указательный элемент, который равен A каждый элемент A:

    [~, jj] = ismember(A,A); 
    result = all(jj==(1:numel(A))); 
    
+1

Я лично, как 'pdist' подход +1 –

+0

@SanthanSalai Благодаря! Есть много вариантов действительно –

+0

@ LuisMendo это все забавные упражнения, но все они кажутся довольно сложными, чем просто использование 'unique'. Я не делал таймингов, но я бы предположил, что они, как правило, еще немного медленнее. Ваша вторая пуля даже требует покупки инструментария. –

4

Я хотел бы использовать

if numel(A) == numel(unique(A)) 
    msgbox ('Elements are different') 
else 
    msgbox ('Elements are not different') 
end 
4

служит ли это ваше требование?

isequal(numel(A), numel(unique(A))) 
Смежные вопросы