Как проверить, соответствуют ли значения в массиве значениям в массиве ячеек
У меня есть массив ячеек под названием 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
Если вы хотите найти какие-либо совпадения независимо от порядка
- Скопируйте две матрицы в две другие матрицы, если вы хотите, чтобы исходные матрицы оставались неизменными.
- Сортировать обе новые матрицы по отдельности
- Сравните самые низкие элементы двух матриц
- Если они совпадают, сохраните элемент в некотором массиве сборщика
- Если нет, переходите к следующему номеру в наборе с наименьшим номером.
- Повторяйте шаги со 2 по 4, пока не пройдете один подход.
- Массив сборщика будет содержать все совпадения.
Это должно выполняться за 2*M*log(M)+2*M времени.
Если вы хотите найти индексы в исходных матрицах, которые соответствуют совпадениям, просто сравните каждый элемент в массиве сборщика с элементами обеих матриц, запишите индекс всякий раз, когда совпадение найдено, и продолжайте, пока не достигнете конца.
Если элементы расположены в определенном порядке, например, координаты, просто сравните элемент 1 в первом наборе с элементом 1 во втором наборе.