Matlab: проблема производительности кода при использовании «ismember» - PullRequest
3 голосов
/ 03 августа 2010

Мне нужно, чтобы этот раздел моего кода работал быстрее, так как он вызывается много раз. Я новичок в Matlab, и мне кажется, что ДОЛЖЕН быть способ сделать это, не такой уж и обходной. Буду признателен за любую помощь, которую вы могли бы дать, как улучшить скорость выполнения моих функций или других функций, которые помогут мне выполнить эту задачу.

(Задача состоит в том, чтобы получить только строки «alldata», где первый столбец находится в наборе «минутных интервалов», в «alldataMinutes». максимум всех данных.

minuteintervals= min(alldata(:,1)):20:max(alldata(:,1)); %20 second intervals
alldataMinutes= zeros(30000,4);
counter=1;
for x=1:length(alldata)
    if ismember(alldata(x,1), minuteintervals)
        alldataMinutes(counter,:)= alldata(x,:);
        counter= counter+1;
    end
end
 alldataMinutes(counter:length(alldataMinutes),:)= [];

1 Ответ

1 голос
/ 03 августа 2010

Это должно дать вам то, что вы хотите, и это должно быть значительно быстрее:

minuteintervals = min(alldata(:,1)):20:max(alldata(:,1));  %# Interval set
index = ismember(alldata(:,1),minuteintervals);  %# Logical index showing first
                                                 %#   column values in the set
alldataMinutes = alldata(index,:);  %# Extract the corresponding rows

Это работает путем передачи вектора значений в функцию ISMEMBER вместо передачи значений по одному. Выход index представляет собой логический вектор того же размера, что и alldata(:,1), со значением 1 (т. Е. Истиной) для элементов alldata(:,1), находящихся в наборе minuteintervals, и значением 0 (т.е. ложь) в противном случае. Затем вы можете использовать логическое индексирование , чтобы легко извлечь строки, соответствующие строкам в index, поместив их в alldataMinutes.

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