我不太确定这是否可能,但我对 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
代码很简单,我就不再解释了。如果您需要说明特定线路在做什么,请告诉我。