MATLAB - работа с вектором

saveliev_a

Суть задачи следующая. Надо из вектора [1 1 1 2 2 3 4 4 5 ... ] получить вектор [3 2 1 2 ...]
i-ая координата нового вектора равна количеству координат старого вектора со значением i.
Следующий вариант слишком долго работает.
for i = 1:n
new_array(i) = size(find(old_array == i 1);
end

kruzer25

for i = 1:p
new_array(old_array(i+=1;
end

?
КОнечно, с предварительной инициализацией new_array...

saveliev_a

Само собой.

Vladu

Суть задачи следующая. Надо из вектора [1 1 1 2 2 3 4 4 5 ... ] получить вектор [3 2 1 2 ...]
i-ая координата нового вектора равна количеству координат старого вектора со значением i.

old_array = [1 1 1 2 2 4 4 4 5 5 5 7 9 9]
[a b] = unique(old_array);
c = zeros(1, a(end;
c(a) = diff([0 b])

Так векторизовано.
Это работает для сортированного массива. А если нет пропусков (есть все числа от 1 до max(old_array в твоем примере это так то

old_array = [1 1 1 2 2 3 4 4 5]
[b b] = unique(old_array);
c = diff([0 b])

saveliev_a

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

Vladu

Хм...На самом деле, тут промежуточная переменная не нужна

old_array = [1 1 1 2 2 3 4 4 5]
[b b] = unique(old_array);
b = diff([0 b])
Оставить комментарий
Имя или ник:
Комментарий: