В связанном вопросе ( Огромная широковещательная переменная, оптимизирующий код без 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 матрицы и более миллионов координатных пар.
Есть идеи?