MatlabSorter предоставил рефакторинг, который имеет смысл для меня, поэтому, если ваш код действительно делает то, что вы хотите, его рефакторинг - это путь вперед :-).
Обратите внимание, что в моих тестах с numberl (Angle) = 50000 его рефакторинг не сильно сэкономил (возможно, потому что мои выборочные данные предполагали, что find () почти никогда не потерпит неудачу, за исключением самого начала и в конце трассировки данных) .
Однако, глядя на ваш код, мне стало интересно: вы уверены, что абсолютно хотите усреднить все значения с первого раза, когда угол попадает в диапазон mid-pi / 2 ... mid + pi / 2, до в последний раз он покидает этот диапазон? Если развернутые углы являются немонотонными (например, если разрешены обратные перемещения, если частота дискретизации слишком мала, чтобы избежать наложения, или просто из-за шума измерения в угле), вы также будете усреднять по некоторым значениям за пределами (и, возможно, за пределами) диапазона 180 °.
Обратите внимание, что в любом случае первое измеренное вами значение (значение (начало)) составляет всегда * на 1010 * больше, чем pi / 2 перед вашим "средним" углом (вы начинаете с последнего угла перед интервалом) в то время как ваше последнее измерение (Значение (отделка + i-1)) всегда больше , чем pi / 2 позади середины. Таким образом, ваш эффективный диапазон, по которому вы усредняете значение, всегда больше, чем pi, даже если доступны значения данных точно в середине pi / 2 и mid + pi / 2 ... это действительно так?
Так что, если вы действительно заинтересованы в усреднении только значений, где угол меньше, чем pi / 2 от середины, вот мой совет по коду, который, к сожалению, имеет лишь незначительно меньшее время выполнения, чем то, что вы используете в настоящее время. Обратите внимание, что это НЕ рефакторинг, потому что он действует не так, как ваш код, двумя способами, описанными выше.
UnwrappedRadians = unwrap( Angle ./ 180 * pi);
AverageValue = Value;
avgstart=find( UnwrappedRadians > (UnwrappedRadians(1) + pi/2), 2, 'First');
avgend=find( UnwrappedRadians < (UnwrappedRadians(end) - pi/2), 1, 'Last');
for i=avgstart:avgend
AverageValue(i) = mean(Value(abs(UnwrappedRadians-UnwrappedRadians(i)) <= pi/2)); % nanmean
end