これが可能かどうかはわかりませんが、MATLABについての私の理解は確かに良くなる可能性があります。
プログラムにかなりのボトルネックが発生しているため、ベクトル化したいコードがいくつかあります。これは最適化ルーチンの一部であり、実行する短期平均(STA)、長期平均(LTA)、および感度(OnSense)の多くの可能な構成があります。
時間はベクトル形式で、FL2onSSはメインデータ(Nx1 double)、FL2onSSSTAはそのSTA(NxSTA double)、FL2onSSThreshはそのしきい値(NxLTAxOnSense double)です。
アイデアは、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
コードは十分に単純なので、これ以上説明しません。特定の行が何をしているのかを解明する必要がある場合は、私に知らせてください。