Форум программистов, компьютерный форум, киберфорум
Наши страницы
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Вронскиан
0 / 0 / 0
Регистрация: 04.12.2013
Сообщений: 11
1

Удалить элементы, которые встречаются более одного раза

08.12.2013, 15:31. Просмотров 2528. Ответов 15
Метки нет (Все метки)

Вопрос состоит в следующем - мне нужно без цикла удалить абсолютно все повторяющиеся элементы. Функцией unique я воспользоваться не могу, так как она оставляет хотя бы один экземпляр повторяющегося элемента.

Мне надо так: a=[1,2,3,1,2], а b в таком случае равно b=[3]
Как сделать это без цикла?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2013, 15:31
Ответы с готовыми решениями:

Подпрограмма: вывести элементы массива, которые встречаются больше 1 раза
Подпрограмма выводит элементы массива, которые встречаются больше 1 раза. Как написать такой код?

Исключить из массива все элементы, встречающиеся более одного раза
Дан одномерный массив A, состоящий из N элементов. Исключить из массива все элементы, встречающиеся...

Нахождение количества столбцов матрицы, не содержащих ни одного нулевого элемента, и максимального числа, встречающихся более одного раза.
Ребята очень нужна помощь, срочно надо сдать индивидуалку две задачки не получилось сделать...

Обменять максимальное и минимальное из чисел, встречающихся в массиве более одного раза
Здравствуйте! Помогите, пожалуйста с программой: Найти максимальное и минимальное из чисел,...

Напечатать все элементы, которые встречаются более одного раза
ЗАДАЧА 5. Выполнить действия над массивами. В таблице при формулировании задания для разъяснения...

15
Зосима
4963 / 3335 / 313
Регистрация: 02.04.2012
Сообщений: 6,220
Записей в блоге: 16
Завершенные тесты: 1
10.12.2013, 19:02 2
Так-с сегодня меня мысль посетила по этому вопросу.

Ну для начала нужно узнать, сколько раз встречаются элементы в массиве, а потом уже делать вывводы и действия
Если использовать цикл, то все просто:
Matlab M
1
2
3
4
5
6
x = randint(1,20,[-3 3]); % массив случайных чисел
for a = unique(x) % перебираем все уникальные элементы
  if sum(x==a)>1 % если число более 1 раза
    x(x==a) = []; % удаляем все числа
  end
end
Но фишка как раз в том, что цикл использовать нельзя
а другая загвоздка в том, что длинна массива х практически никогда не равна длине а, поэтому без цикла их переварить затруднительно, на первый взгляд...
С другой стороны, если длины векторов разные, то это наталкивает на мысль об матричном умножении (столбец на строку дает матрицу), но нам нужно сравнить, а не умножать. можно поделить, т.е. умножить на обратное, но если там будет ноль, получим бесконечность... остается только искать разность, а такую штуку я уже делал тут
Получаем:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
clear all
clc
 
x = randint(1,10,[-3 3])
x = x(:); % делаем столбец, ибо это важно
a = unique(x)' % уникальные элементы - вектор строка
u = log(exp(x)*exp(-a)) % вычитаем поэлементно искомые числа
% i-й столбец равен x-a(i)
M = abs(u) <= 1e-10 % там где разность практически нулевая
a % тображаем для наглядности вектор уникальных элементов
N = sum(M) % и их количество в массиве
x( any(M(:,N>1),2) ) = [] % удаляем повторки
вот это заклинание: any(M(:, N>1),2) - делаем any (поэлементное ИЛИ) по строкам (поэтому 2) в тех столбцах, где N>1
3
Arrow
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 15
10.09.2015, 16:30 3
Цитата Сообщение от Зосима Посмотреть сообщение
Ну для начала нужно узнать, сколько раз встречаются элементы в массиве, а потом уже делать вывводы и действия
Если использовать цикл, то все просто:
Код Matlab MВыделить код
Matlab M
1
2
3
4
5
6
x = randint(1,20,[-3 3]); % массив случайных чисел
for a = unique(x) % перебираем все уникальные элементы
* if sum(x==a)>1 % если число более 1 раза
* * x(x==a) = []; % удаляем все числа
* end
end
Всем привет, у меня матлаб матерится на этот код:
Error using ==
Matrix dimensions must agree

есть мысли как это пофиксить? И еще вопрос, я нигде не могу найти подробного описания функции unique, хотелось бы почитать. Пытаюсь допилить этот код, но при том мне нужно получить исходный массив x, в котором все НЕ уникальные элементы будут приравнены к нулю, а все уникальные элементы останутся на своих i-тых местах

второй день ковыряюсь, что то пока не получается
0
kRosis
186 / 191 / 43
Регистрация: 13.05.2013
Сообщений: 708
10.09.2015, 16:53 4
Цитата Сообщение от Arrow Посмотреть сообщение
И еще вопрос, я нигде не могу найти подробного описания функции unique, хотелось бы почитать
http://www.mathworks.com/help/matlab/ref/unique.html
Цитата Сообщение от Arrow Посмотреть сообщение
есть мысли как это пофиксить?
Если код у Зосимы скопировали, то там все в порядке.
1
10.09.2015, 16:53
Arrow
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 15
10.09.2015, 17:35 5
Цитата Сообщение от kRosis Посмотреть сообщение
Если код у Зосимы скопировали, то там все в порядке.
не сомневаюсь, конечно я скопировал не полный код, у меня матрица x представляет собой вектор-столбец из 12к чисел, уникальных элементов там около 3к

Добавлено через 9 минут
Пофиксил, транспонировал x в вектор-строку. Если есть мысли по основной задаче, буду очень благодарен
0
kRosis
186 / 191 / 43
Регистрация: 13.05.2013
Сообщений: 708
10.09.2015, 17:52 6
Цитата Сообщение от Arrow Посмотреть сообщение
Если есть мысли по основной задаче, буду очень благодарен
Если по этому вопросу
Цитата Сообщение от Arrow Посмотреть сообщение
нужно получить исходный массив x, в котором все НЕ уникальные элементы будут приравнены к нулю, а все уникальные элементы останутся на своих i-тых местах
То в 4 строке кода Зосимы меняете [] на 0.
0
Arrow
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 15
10.09.2015, 18:05 7
Цитата Сообщение от kRosis Посмотреть сообщение
То в 4 строке кода Зосимы меняете [] на 0.
конечно эта мысль была первой что пришла мне в голову , но к сожалению это не то что мне нужно, предположим у меня формируется вектор a который состоит только из уникальных элементов вектора x, мне нужно повторно перебрать вектор x (совпадает ли его элемент с каким нибудь элементом вектора а) и если совпадает оставить этот элемент, если нет - занулить. В одном цикле я не знаю получится ли это сделать, думаю нужно будет использовать цикл по i и по k для x(i) и a(k) и перебирать совпадения по каждому элементу x(i), но в этом случае почему то у меня из 3к уникальных элементов появляется только одно.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
a = unique(x)
 
for k=1:size(a,2)
   for i=1:size(x,2)
      if x(i) == a(k);
         y(i) = a(k);
      else
         y(i)=0;
      end
   end
end
0
kRosis
186 / 191 / 43
Регистрация: 13.05.2013
Сообщений: 708
10.09.2015, 18:12 8
Arrow, А не проще занулить уникальные элементы в векторе Х?
Чем вот составлять вектор А из уникальных Х, после сравнивать их элементы и удалять совпадения из Х.
Или я опять же вас не понимаю)
0
Arrow
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 15
10.09.2015, 18:16 9
Цитата Сообщение от kRosis Посмотреть сообщение
Arrow, А не проще занулить уникальные элементы в векторе Х?
Чем вот составлять вектор А из уникальных Х, после сравнивать их элементы и удалять совпадения из Х.
Или я опять же вас не понимаю)
проще, только вот не работает если заменить y на x, а почему не работает пока не понимаю

Добавлено через 1 минуту
Цитата Сообщение от Arrow Посмотреть сообщение
но в этом случае почему то у меня из 3к уникальных элементов появляется только одно.
с этим не большое дополнение, это число как раз последнее в векторе a , почему то остальные элементы в новый вектор не записываются
0
kRosis
186 / 191 / 43
Регистрация: 13.05.2013
Сообщений: 708
10.09.2015, 18:23 10
А чего не получается? Вот код зануления уникальных элементов
Matlab M
1
2
3
4
5
6
7
x = randint(1,20,[-3 3])
for a = unique(x)
  if sum(x==a)==1
    x(x==a) = 0;
  end
end
x
1
Arrow
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 15
10.09.2015, 18:37 11
почему то раньше он не срабатывал, наверно где то была ошибка, однако чутка допилил для зануления НЕ уникальных элементов. спасибо за помощь
0
Arrow
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 15
14.09.2015, 20:41 12
Ребят, а вот такой вопрос на засыпку, код удаляет все элементы которые встречаются больше одного раза, а можно ли как то оставить первый встретившийся элемент, а остальные удалить. (то есть кроме уникальных элементов оставить еще первый не уникальный) ?
0
kRosis
186 / 191 / 43
Регистрация: 13.05.2013
Сообщений: 708
14.09.2015, 22:54 13
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
%x = randint(1,10,[-5 5]);
x = [-1 -5 -3 5 -4 4 0 5 -5 -1]
pe = true;
for a = unique(x)
  if sum(x==a) > 1
      if pe == false
          x(x==a) = [];
      end;
      pe = false;
  end
end
x
Но нужно понимать, что под "первым не уникальным" подразумевается минимальное число.
1
Arrow
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 15
15.09.2015, 12:46 14
спасибо, но может быть я не до конца описал задачу. Допустим есть у нас уникальные элементы и не уникальные, и тех и других много, но НЕ уникальные элементы это те, которые встречаются более 1 раза, можно ли оставить каждый первый НЕ уникальный элемент (то есть не самый первый (минимальный) а каждый первый).
0
kRosis
186 / 191 / 43
Регистрация: 13.05.2013
Сообщений: 708
15.09.2015, 16:42 15
Цитата Сообщение от Arrow Посмотреть сообщение
спасибо, но может быть я не до конца описал задачу. Допустим есть у нас уникальные элементы и не уникальные, и тех и других много, но НЕ уникальные элементы это те, которые встречаются более 1 раза, можно ли оставить каждый первый НЕ уникальный элемент (то есть не самый первый (минимальный) а каждый первый).
Дак тупо
Matlab M
1
a = unique(x)
Но идет сортировка по возрастанию.

Matlab M
1
2
[c,i,j] = unique(x);
Q = x(sort(i));
Вот так без сортировки
1
Arrow
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 15
15.09.2015, 18:18 16
о как, спасибо
0
15.09.2015, 18:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2015, 18:18

Найти все элементы массива, которые встречаются в нем не более одного раза
Нужна помощь. Задание такого : в двумерном массиве А найти все элементы, которые встречаются в нем...

Все элементы вектора, которые встречаются более одного раза, переписать в другой вектор
Все элементы вектора V,которые встречаються более одного раза ,переписать в другой вектор. Задача...

В строках матрицы оставить элементы, которые встречаются более одного раза, остальные заменить нулем
Изменить таблицу a так чтобы в строках остались элементы которые встречаются более одного раза,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru