Идентификация / извлечение идентичных кривых из графика с несколькими кривыми

#matlab

#matlab

Вопрос:

Допустим, у меня есть график, содержащий 300 кривых. Есть ли какой-либо метод в Matlab 2014a, чтобы я мог определить, какие кривые идентичны друг другу? Чтобы быть более конкретным, если у меня есть 10 кривых на одной фигуре, кривая 1 идентична и очень близка к кривой 2, то же самое происходит с кривыми 3,4 и 5. Есть ли какой-либо автоматизированный способ для Matlab сделать это вместо визуального осмотра?

Спасибо

Джордж

Комментарии:

1. Какая информация у вас есть о кривых? Как вы их генерируете?

2. У меня есть температура на 24-часовой основе для каждого дня. Я хотел бы определить температуры дней, которые идентичны и очень близки друг к другу, чтобы я мог представить их в среднем.

Ответ №1:

Может занять некоторое время, но если ваши 300 кривых находятся в массиве, скажем c(n,300) . n является произвольным и представляет собой количество точек, которые у вас есть на каждой кривой.

Для i in 1:300 и j in i:300 вы хотите сравнить c(:,i) - c(:,j) с заданным порогом (который зависит от того, насколько вы хотите, чтобы две кривые отличались друг от друга). Я делаю это с помощью: abs(sum(c(:,i) - c(:,j))) < thresh -> суммирую разницу для всех точек между 2 кривыми, разница должна быть небольшой, если кривые похожи.

Когда вы обнаружите, что a c(:,j) ниже порогового значения, вы хотите удалить его из пула 300 кривых. Это делается с помощью c = c(:,~ismember(1:size(c,2),j)); которого вы получаете код, подобный:

 i = 1;
thresh = 1; %arbitrary threshold here adapt to you needs
while i<size(c,2)
j = i 1;
while j<size(c,2)
if abs(sum(c(:,i) - c(:,j))) < thresh
c = c(:,~ismember(1:size(c,2),j)); %remove the curve j from c
else
j = j 1;
end
end
i = i 1;
end
 

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

Комментарии:

1. @user3775255 Можете ли вы принять ответ, если он отвечает на ваш вопрос?

2. Я попробовал ваш код с 12 кривыми, но для завершения моделирования требуется очень много времени. На самом деле я не мог ждать, и мне пришлось выйти из Matlab. Это нормально?

3. @Джордж Стрэндж, ты можешь где-нибудь опубликовать свои данные? На матрице c , которую я произвольно создал, она работает очень быстро.

4. Как я могу опубликовать свои данные? Матрица c представляет собой матрицу 24×12.

5. Я также хотел бы знать, какие столбцы были удалены, и сохранить их в другой матрице. Вместо удаления кривых я хотел бы сохранить их в другой матрице, чтобы я мог видеть, какие столбцы матрицы c идентичны или близки друг к другу. Как это можно сделать?