Matlab: оптимизировать это (часть 2) - PullRequest
1 голос
/ 30 сентября 2011

Вот еще один:

ValidFirings = ((DwellTimes > 30/(24*60*60)) | (GroupCount > 1));

for i = length(ValidFirings):-1:2
    if(~ValidFirings(i))
        DwellTimes(i-1) = DwellTimes(i)+DwellTimes(i-1);
        GroupCount(i-1) = GroupCount(i)+GroupCount(i-1);
        DwellTimes(i) = [];
        GroupCount(i) = [];
        ReducedWallTime(i) = [];
        ReducedWallId(i) = [];
    end
end

Похоже, что цель состоит в суммировании «времени задержки» на основе того, считается ли срабатывание датчика действительным.Таким образом, у меня есть вектор срабатываний датчика, который я прошёл назад и суммировал в предыдущем ряду, если текущий ряд не помечен как действительный.

Я могу визуализировать это в C / C ++, но я не знаю, какперевести его в лучшую векторную запись Matlab.В нынешнем виде этот цикл очень медленный.

РЕДАКТИРОВАТЬ: Могу ли я использовать некоторую форму DwellTimes = DwellTimes (cumsum (ValidFirings))??

Ответы [ 2 ]

2 голосов
/ 01 октября 2011

Как и в предыдущем вопросе, замена цикла for должна повысить производительность.

%# Find the indices for invalid firings
idx = find(~(DwellTimes > 30/(24*60*60)) | (GroupCount > 1));

%# Index the appropriate elements and add them (start the addition
%# from the second element)
%# This eliminates the for loop
DwellTimes(idx(2:end)-1) = DwellTimes(idx(2:end)-1)+DwellTimes(idx(2:end));
GroupCount(idx(2:end)-1) = GroupCount(idx(2:end)-1)+GroupCount(idx(2:end));

%# Now remove all the unwanted elements (this removes the 
%# first element if it was a bad firing.  Modify as necessary)
GroupCount(idx)=[];
DwellTimes(idx)=[];
1 голос
/ 30 сентября 2011

Я бы сначала консолидировал, как показано, а затем удалил неверные данные. Это позволяет избежать постоянного изменения размера данных. Обратите внимание, что вы не можете изменить порядок цикла FOR из-за способа распространения значений.

ValidFirings = ((DwellTimes > 30/(24*60*60)) | (GroupCount > 1));

for i = length(ValidFirings):-1:2
    if (~ValidFirings(i))
        DwellTimes(i-1) = DwellTimes(i) + DwellTimes(i-1);
        GroupCount(i-1) = GroupCount(i) + GroupCount(i-1);
    end
end

DwellTimes      = DwellTimes(ValidFirings);
GroupCount      = GroupCount(ValidFirings);
ReducedWallTime = ReducedWallTime(ValidFirings);
ReducedWallId   = ReducedWallId(ValidFirings);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...