Найти суммарное расстояние до горизонтальной линии для всех точек в Matlab - PullRequest
0 голосов
/ 07 января 2020

У меня график рассеяния примерно 30 000 точек, все из которых на ie выше горизонтальной линии, которую я визуально определил на своем графике. Теперь моя цель - суммировать расстояние по вертикали всех этих точек до этой горизонтальной линии.

Данные были прочитаны из файла .csv и уже сохранены в рабочей области, но мне также нужно проверить значение NaN и игнорируйте их.

Вот где я сейчас нахожусь:

vert_deviation = 0;
idx = 1;
while idx <= numel(my_data(:,5)) && isnan(idx) == 0
    vert_deviation = vert_deviation + ((my_data(idx,5) - horiz_line_y_val));
    idx = idx + 1;
end

Я знаю, что обязательным условием использования оператора && является я верю, что у меня два logical заявления, но я не уверен, как переписать это l oop в данный момент. Я также не понимаю, почему vert_deviation возвращает NaN в данный момент, но я предполагаю, что это может быть связано с первой ошибкой, которую я описал ...

Я был бы очень признателен за некоторые указания здесь - спасибо заранее!

РЕДАКТИРОВАТЬ: «Горизонтальная линия» является небольшим упрощением - в действительности нижний предел, мне нужно найти расстояние, состоит из 6 различных отрезков линии

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Ваш l oop не исключает значений NaN, потому что isnan(idx) == 0 проверяет, является ли индекс NaN, вместо проверки, является ли точка данных NaN. Вместо этого отметьте isnan(my_data(idx,5)).


. Кроме того, вы можете упростить свой код, используя for вместо while:

vert_deviation = 0;
for idx=1:size(my_data,1)
   if !isnan(my_data(idx,5))
      vert_deviation = vert_deviation + ((my_data(idx,5) - horiz_line_y_val));
   end
end

As @ Adriaan предложил, вы можете удалить l oop в целом, но кажется, что код в OP - упрощенное решение проблемы. Глядя на опубликованный дополнительный код, я думаю, что все еще возможно удалить петли, но я не уверен, что это будет существенным улучшением скорости. Просто используйте al oop.

0 голосов
/ 07 января 2020

Я должен был указать, что нижний предел, до которого мне нужно вычислить расстояние для всех точек диаграммы рассеяния, варьируется для разных значений x (фрагмент горизонтальной линии должен был быть упрощением, но, возможно, вводил в заблуждение ... извинения за это )

Сначала я изменил данные, которые я уже прочитал, в рабочую область, заменив все значения NaN на 0. Затем я написал while l oop, который определяет число, если индексы до l oop through, и определил условие && для фильтрации любых нулей. Затем я написал вложенный if l oop, который проверяет, в какой диапазон значений x попадает данный индекс, и затем принимает дельту между значениями y нижнего предела линейной линии для этого участка графика и заданной точки , Я повторил это для всех точек.

while idx <= numel(my_data(:,3)) && not(my_data(idx,3) == 0)
    ...
    if my_data(idx,3) < upper_x_lim && my_data(idx,5) > lower_x_lim
        vert_deviation = vert_deviation + (my_data(idx,4) - (m6 * (my_data(idx,5)) + b6))
    end
    ...

m6 и b6 в этом случае - наклон и у-пересечение, рассчитанные для одного участка графика. if l oop повторяется шесть раз для каждой секции нижнего предела.

Я уверен, что есть более элегантные способы сделать это, поэтому я открыт для любых отзывов, если есть место для улучшения!

...