• Регистрация
fatbad
fatbad+12.54
н/д
  • Написать
  • Подписаться

Как ускорить вычисления

03.06.2020
Коллеги, доброе утро Как ускорить код? for i=1:length(data1.gTruth.DataSource.Source) for j=length(data1.gTruth.DataSource.Source{i}):-1:1 if contains(data1.gTru...

Коллеги, доброе утро

Как ускорить код?

    for i=1:length(data1.gTruth.DataSource.Source)
     
        for j=length(data1.gTruth.DataSource.Source{i}):-1:1
        
            if contains(data1.gTruth.DataSource.Source{i}(j:end),'\')
                data1.gTruth.DataSource.Source{i}(j:end);
                folderName{i}=data1.gTruth.DataSource.Source{i}(1:j);
                break
            end
        end
    end
    
uniqName=unique(folderName)';
for i=1:length(uniqName)
    alternativePaths={[ uniqName{i}   dirWayOut ]};
    unresolvedPaths = changeFilePaths(data1.gTruth,alternativePaths);
end

 

Задача изменить путь к картинкам, но такой алгоритм считает долго 44000 сек. Как можно получить путь к файлу из следующей сроки

C:\Users\USER\Documents\Matlab\new_captcha_with_mounting_dots\New folder (2)\737515.526.png

Теги

      03.06.2020

      Комментарии

      • kurguz
        kurguz+156.46
        3.06.2020 12:50

        Код проверяют профайлером, он показывает слабые места. Но, поскольку данные нам неизвестны, то можно подебажить код только теоретически. Как можно значительно ускорить этот код:

        1. Избавиться от циклов

        2. Использовать регулярные выражения для работы с текстом

        3. Подобрать оптимальные типы для переменных

        4. Выделять память под переменные до их создания в цикле

         

        Последний ваш вопрос непонятен, строка C:\Users\USER\Documents\Matlab\....png  - это и есть путь к файлу.

        • fatbad
          fatbad+12.54
          3.06.2020 13:12

          пока сделал так:

          for j=length(data1.gTruth.DataSource{1}):-1:1
                  j;
                  if contains(data1.gTruth.DataSource{1}(j:end),'\')
                      
                      folderNameTemp=data1.gTruth.DataSource{1}(1:j);
                      break
                  end
              end
              
              for i=1:length(data1.gTruth.DataSource)
                  if contains(data1.gTruth.DataSource{i},folderNameTemp)
                      folderName{i}= folderNameTemp;
                  else
                      for j=length(data1.gTruth.DataSource{i}):-1:1
                          j;
                          if contains(data1.gTruth.DataSource{i}(j:end),'\')
                              folderName{i}=data1.gTruth.DataSource{i}(1:j);
                              folderNameTemp=data1.gTruth.DataSource{i}(1:j)
                              break
                          end
                      end
                  end
              end

          данные позволяют.

          второй вопрос был: как из C:\Users\USER\Documents\Matlab\new_captcha_with_mounting_dots\New folder (2)\737515.526.png поулчить C:\Users\USER\Documents\Matlab\new_captcha_with_mounting_dots\New folder (2)\? Есть ли какая-нибудь встроенная функция?

          • kurguz
            kurguz+156.46
            3.06.2020 17:38

            Вот так можно сделать:

            >> [path,~,~]=fileparts('C:\Users\USER\Documents\Matlab\new_captcha_with_mounting_dots\New folder (2)\737515.526.png')
            
            path =
            
                'C:\Users\USER\Documents\Matlab\new_captcha_with_mounting_dots\New folder (2)'