Размер компонента вокруг набора координат - PullRequest
0 голосов
/ 14 апреля 2019

В связанном вопросе ( Огромная широковещательная переменная, оптимизирующий код без parfor? ) я изо всех сил пытался оптимизировать код, который обнаруживал количество и размер подключенных компонентов (групп элементов с тем же значением, что и расположены рядом друг с другом).

Код работает быстрее, чем раньше, и выглядит следующим образом:

  FRAGMENTSIZESCLASS = cell(NumberOfClasses,1);
  for class=1:NumberOfClasses
    %-First we create a binary image for each class-%
    BWclass = Raster==class;
    %-Second we calculate the number of connected components (fragments) and the size of each fragment-%
    CC = bwconncomp(BWclass);
    numPixels = cellfun(@numel,CC.PixelIdxList);  
    FRAGMENTSIZESCLASS{class}=numPixels;
  end

Проблема в том, что теперь у меня есть набор координат (матричные индексы), и мне нужно получить размер компонента, связанный с каждой парой координат. Если индекс = [1 1]; и растр = [5 5 8 2; 5 3 6 5]; Тогда я должен знать, что класс "5" имеет два кластера размеров 3 и 1 (что будет указано в приведенном выше коде), и что координаты (1,1) соответствуют кластеру размера 3.

В предыдущей версии кода - вы можете увидеть ссылку выше, но я воспроизвожу ее здесь:

FRAGMENTSIZESCLASS = struct([]);  %We store the data in a structure
for class=1:NumberOfClasses
  %-First we create a binary image for each class-%
  BWclass = Raster==class;
  %-Second we calculate the number of connected components (fragments)-%
  L = bwlabeln(BWclass);          %returns a label matrix, L, containing labels for the connected components in BWclass
  clear BWclass
  NumberFragments=max(max(L));
  %-Third we calculate the size of each fragment-%
  FragmentSize=zeros(NumberFragments,1);
  for f=1:NumberFragments      % potential improvement: using parfor while saring the memory between workers
    FragmentSize(f,1) = sum(L(:) == f);
  end
  FRAGMENTSIZESCLASS{class}=FragmentSize;
  clear L
end

эту информацию можно получить из матрицы "L", просто увидев, что L (1,1) = 1 и что в L есть три значения "1", означающие, что размер компонента для этих координат равен 3.

Проблема с этой версией кода, как можно видеть на картинке, которую я загрузил с обновлением, заключается в том, что она удивительно медленнее, чем новая версия, до такой степени, что было бы невозможно запустить ее в 40000 80000 матрицы и более миллионов координатных пар.

Есть идеи?

...