我不太確定這是否可行,但我對MATLAB的理解肯定會更好。在MATLAB中向量化循環
我有一些代碼我希望向量化,因爲它在我的程序中造成了相當多的瓶頸。它是優化程序的一部分,它具有許多可能的短期平均(STA),長期平均(LTA)和靈敏度(OnSense)配置。
時間是以矢量形式,FL2onSS是主數據(NX1雙),FL2onSSSTA是其STA(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
我目前得到這個重複,企圖獲得更多一點的速度了它的功能,但顯然這將是更好的,如果整個事情可以矢量化。換句話說,如果有更好的解決方案,我不需要保留這個功能。
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
代碼很簡單,所以我不會再解釋它。如果您需要澄清特定行的功能,請告訴我。
太棒了!謝謝Ofri。 這肯定會讓我有點消化,我需要澄清幾點: 我假設行 FL2onSSThresh3 =重塑(FL2onSSThresh,[N,O * P]); 實際上應該與FL2onSSThresh2關聯? timeDiff = etime(Time(i,:),Time(i-1,:)); 在這種情況下是不是會工作?因爲我們不再使用我來迭代。時間是一個datevec,所以我假設我可以使用timeDiff = diff(Time)代替上面的代碼行,但是這會給出一個尺寸大不相同的數組,並且Red3操作失敗。 – Geodesic
你說得對。我會編輯修復它。 –