Как проверить, соответствуют ли значения в массиве значениям в массиве ячеек

У меня есть массив ячеек под названием grnPixels размера (1 x 40)где каждая отдельная ячейка имеет M x 1 векторный массив чисел где M является переменной У меня также есть один векторный массив под названием redCentroid размера N x 1,

Я хочу проверить, если значения в redCentroid соответствуют любым значениям в grnPixels, Я сделал код, но он очень медленный в этом коде Matlab. Как я могу улучшить это?

nRedCells = length(propsRed);
nGrnCells = length(propsGrn);
grnPixels = cell(1,nGrnCells);
redCentroid = zeros(nRedCells,1);
matchMemory = zeros(nRedCells,1);

for j = 1:nRedCells
    for i = 1:nGrnCells
        for n = 1:length(grnPixels{i})
            matchment = ismember(redCentroid(j),grnPixels{i}(n));
            if matchment == 1
                matchMemory(j,1:2) = [j i];
            end
            continue
        end
     end
 end

Пример данных

redCentroid

51756
65031
100996
118055
122055
169853
197175
233860
244415
253822

grnPixels{1}

142
143
100996
167
168

grnPixels{2}

537
538
539
540
541
542
233860
244415
545
546
547
548

2 ответа

Решение

ismember может принимать матрицу как для первого, так и для второго входа, поэтому нет необходимости во внешнем цикле или самом внутреннем цикле.

matchMemory = zeros(numel(redCentroid), 2);

for k = 1:numel(grnPixels)
    % Check which of the centroids are in grnpixels
    isPresent = ismember(redCentroid, grnPixels{k});

    % If they were present fill in the first column with the index in red
    matchMemory(isPresent, 1) = find(isPresent);

    % Fill in the second column with the index in green
    matchMemory(isPresent, 2) = k;
end

Если вы хотите найти какие-либо совпадения независимо от порядка

  1. Скопируйте две матрицы в две другие матрицы, если вы хотите, чтобы исходные матрицы оставались неизменными.
  2. Сортировать обе новые матрицы по отдельности
  3. Сравните самые низкие элементы двух матриц
  4. Если они совпадают, сохраните элемент в некотором массиве сборщика
  5. Если нет, переходите к следующему номеру в наборе с наименьшим номером.
  6. Повторяйте шаги со 2 по 4, пока не пройдете один подход.
  7. Массив сборщика будет содержать все совпадения.

Это должно выполняться за 2*M*log(M)+2*M времени.

Если вы хотите найти индексы в исходных матрицах, которые соответствуют совпадениям, просто сравните каждый элемент в массиве сборщика с элементами обеих матриц, запишите индекс всякий раз, когда совпадение найдено, и продолжайте, пока не достигнете конца.

Если элементы расположены в определенном порядке, например, координаты, просто сравните элемент 1 в первом наборе с элементом 1 во втором наборе.

Другие вопросы по тегам