Matlab: оптимизировать это? - PullRequest
       12

Matlab: оптимизировать это?

2 голосов
/ 30 сентября 2011

Я новичок в Matlab. Было поручено ускорить процедуру. Я уверен, что есть лучший способ сделать следующие утверждения:

for i = 2:length(WallId)
     if WallId(i) ~= WallId(i-1)
        ReducedWallId = [ReducedWallId;WallId(i)];
        ReducedWallTime = [ReducedWallTime;WallTime(i)];
        GroupCount = [GroupCount;tempCount];
        tempCount = 1;
    else
        tempCount = tempCount +1;
    end
end

Я могу предварительно распределить различные переменные на «length (WallId)», но что мне делать с дополнительным после его завершения? Меня это волнует?

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011
idx = find([true diff(WallId) ~= 0]);
ReducedWallId = WallId(idx);
ReducedWallTime = WallTime(idx);
GroupCount = diff([idx numel(WallId)+1]);

Предполагая, что вы хотите получить сводку уникальных данных в WallId и WallTime, вы должны убедиться, что WallId отсортирован первым.Вы можете реорганизовать WallTime для соответствия следующим образом:

[WallId, ind] = sort(WallId);
WallTime = WallTime(ind);

Кроме того, вы получите правильный ответ, только если WallTime соответствует, когда WallId делает.

2 голосов
/ 30 сентября 2011

Использовать векторизацию.

ReducedWallId=WallId(find(diff(WallId)~=0));

и аналогично для ReducedWallTime.

Явные циклы for очень медленные. Использование векторных операций значительно ускоряет все. Это общая тема оптимизации кода MATLAB, которая подробно описана в различных документах, найденных в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...