Я не уверен, возможно ли это, но мое понимание MATLAB, безусловно, может быть лучше.Векторизация для петель в MATLAB
У меня есть код, который я хочу прописать, поскольку он вызывает довольно узкое место в моей программе. Это часть процедуры оптимизации, которая имеет множество возможных конфигураций краткосрочного среднего (STA), долгосрочного среднего (LTA) и чувствительности (OnSense) для выполнения.
Время в векторном формате, FL2onSS это основные данные (ые NX1 дважды), FL2onSSSTA является его СТА (NxSTA дважды), FL2onSSThresh является его пороговое значение (NxLTAxOnSense двойной)
Идея заключается в том, чтобы вычислить красный сигнальная матрица, которая будет 4D - alarmStatexSTAxLTAxOnSense, которая используется в остальной части программы.
Red = zeros(length(FL2onSS), length(STA), length(LTA), length(OnSense), 'double');
for i=1:length(STA)
for j=1:length(LTA)
for k=1:length(OnSense)
Red(:,i,j,k) = calcRedAlarm(Time, FL2onSS, FL2onSSSTA(:,i), FL2onSSThresh(:,j,k));
end
end
end
В настоящее время я получил это повторять функцию в попытке получить немного больше скорости из него, но, очевидно, это будет лучше, если все, что может быть vectorised. Другими словами, мне не нужно сохранять функцию, если есть лучшее решение.
function [Red] = calcRedAlarm(Time, FL2onSS, FL2onSSSTA, FL2onSSThresh)
% Calculate Alarms
% Alarm triggers when STA > Threshold
zeroSize = length(FL2onSS);
%Precompose
Red = zeros(zeroSize, 1, 'double');
for i=2:zeroSize
%Because of time chunks being butted up against each other, alarms can
%go off when they shouldn't. To fix this, timeDiff has been
%calculated to check if the last date is different to the current by 5
%seconds. If it isn't, don't generate an alarm as there is either a
%validity or time gap.
timeDiff = etime(Time(i,:), Time(i-1,:));
if FL2onSSSTA(i) > FL2onSSThresh(i) && FL2onSSThresh(i) ~= 0 && timeDiff == 5
%If Short Term Avg is > Threshold, Trigger
Red(i) = 1;
elseif FL2onSSSTA(i) < FL2onSSThresh(i) && FL2onSSThresh(i) ~= 0 && timeDiff == 5
%If Short Term Avg is < Threshold, Turn off
Red(i) = 0;
else
%Otherwise keep current state
Red(i) = Red(i-1);
end
end
end
Код достаточно прост, поэтому я не буду его объяснять. Дайте мне знать, если вам нужно разъяснить, что делает конкретная линия.
Отлично! Благодарю Офри. Это, безусловно, займет немного времени, и мне нужно прояснить несколько моментов: Я предполагаю, что строка FL2onSSThresh3 = reshape (FL2onSSThresh, [N, O * P]); действительно должен быть связан с FL2onSSThresh2? timeDiff = etime (Time (i, :), Time (i-1, :)); Не будет работать в этом случае? Поскольку мы больше не используем i для итерации. Time is datevec, поэтому я предполагаю, что я могу просто использовать timeDiff = diff (Time) вместо вышеуказанной строки, но это дает массив с совершенно разными измерениями, а операции Red3 терпят неудачу. – Geodesic
Вы правы. Я отредактирую, чтобы исправить это. –