1. Вы итерация каждого массива (т.е. вектора) отсчеты два раза с find
: один раз для нахождения высоких выбросов и один раза для нахождения низких выбросов. Вы можете сделать это в одной итерации просто:
a_outlier_indices = find(D.a < aMin | D.a > aMax);
2. Другое дело: вообще говоря for
в MATLAB довольно дорого, попробуйте использовать встроенные возможности синтаксиса MATLAB для получения тех же результатов , Более конкретно, MATLAB позволяет извлекать суб-вектор из другого вектора, используя вектор индексов:
a_outliers = D.sensorID(a_outlier_indices);
Просто кормление D.a
с вектором индексов дает искомый вектор недопустимым.
3. Также, совет для хорошей практики: рекомендуется хранить массивы a
через d
в массиве ячеек векторов вместо отдельных массивов, что-то вроде: D.readings = {a, b, c, d}
и определения массива ячеек соответствующих порогов (thr
в моем примере), так что вы можете сохранить код с помощью цикла:
thr = {[aMin, aMax]; [bMin, bMax]; [cMin, cMax]; [dMin, dMax]}
outliers = cell(4, 1);
for i = 1:4
outlier_indices = find(D.readings{i} < thr{i}(1) | D.readings{i} > thr{i}(2));
outliers{i} = D.sensorID(outlier_indices);
end
Теперь вы будете иметь все, что в массиве ячеек outliers
. Чтобы получить доступ к а выпадающим использовать outliers{1}
, чтобы получить доступ к б выпадающим использовать outliers{2}
, и так далее ...
Вы можете, конечно, патч все вместе (как в вопросе) в один вектор простой конкатенации внутри for
петля:
outliers = [outliers, D.sensorID(outlier_indices)];
вместо outliers{i} = ...
заявления.
P.S
Я предполагаю, что использование мин/макс пороговых значений, что вы хотите использовать при поиске выбросов. Существуют и другие методы поиска выбросов, но это даст разные результаты.
Ваша методология выглядит отлично. Если вы ищете другие способы найти выбросы, то вот еще один способ: подумайте о 2D гауссово, сосредоточенном на средних показаниях для каждого датчика. Когда конкретное считывание датчика проходит два стандартных отклонения, возможно, вы можете считать это как выброс. Теперь вместо того, чтобы устанавливать низкий/низкий порог вокруг каждого датчика, вам просто нужно приспосабливать нормали к каждому датчику и определять один порог, то есть, сколько стандартных отклонений от средней точки должно быть до того, как оно будет рассмотрено вылет. – kitchenette