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

У меня есть массив ячеек с именем 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

person Senyokbalgul    schedule 24.07.2016    source источник


Ответы (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
person Suever    schedule 24.07.2016
comment
Привет, мне кажется, что Dimensions of matrices being concatenated are not consistent в cat(2, grnPixels{:}). - person Senyokbalgul; 24.07.2016
comment
@Senyokbalgul Только что сделал небольшую настройку. - person Suever; 24.07.2016
comment
Итак, все элементы массива зеленых пикселей не M x 1, как вы сказали? - person Suever; 24.07.2016
comment
Кроме того, я, кажется, не получаю индексы значений, когда использую предыдущий код цикла for, который вы предоставили. Строка matchMemory(j,1:2) = [j i] является ключевой. - person Senyokbalgul; 24.07.2016
comment
@Senyokbalgul Пожалуйста, предоставьте несколько простых примеров данных, которые я могу запустить. - person Suever; 24.07.2016
comment
Массив ячеек равен 49 x 1 и может меняться. Массивы внутри массива ячеек имеют разный размер 209 x 1 или 100 x 1 и т. д. - person Senyokbalgul; 24.07.2016
comment
Хорошо, обычно каждая отдельная ячейка имеет векторный массив чисел M x 1, который указывает на то, что каждый элемент имеет одинаковый размер. Я обновлю его, и если вы можете предоставить некоторые примеры данных, я действительно смогу его протестировать. - person Suever; 24.07.2016
comment
Ах, извините за это, я добавил некоторые образцы данных. - person Senyokbalgul; 24.07.2016
comment
@Senyokbalgul Обновлено. - person Suever; 24.07.2016

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

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

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

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

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

person AlgorithmsX    schedule 24.07.2016