Я ищу «хороший» способ найти матрицу (рисунок) в большей матрице (произвольное количество измерений).Общий метод поиска подматрицы в матрице Matlab
Пример:
total = rand(3,4,5);
sub = total(2:3,1:3,3:4);
Теперь я хочу, чтобы это произошло:
loc = matrixFind(total, sub)
В этом случае loc
должен стать [2 1 3]
.
На данный момент мне просто интересно найти один пункт (если он существует), и я не беспокоюсь о проблемах округления. Можно предположить, что sub
«подходит» в total
.
Вот как я мог сделать это для 3-х измерениях, однако он просто чувствует, что есть лучший способ:
total = rand(3,4,5);
sub = total(2:3,1:3,3:4);
loc = [];
for x = 1:size(total,1)-size(sub,1)+1
for y = 1:size(total,2)-size(sub,2)+1
for z = 1:size(total,3)-size(sub,3)+1
block = total(x:x+size(sub,1)-1,y:y+size(sub,2)-1,z:z+size(sub,3)-1);
if isequal(sub,block)
loc = [x y z]
end
end
end
end
Я надеюсь найти приемлемое решение для произвольного числа размеров.
Не уверен, если это будет способствовать решению, но может 'ndims (суб)' предполагается равным 'ndims (общего)'? – ojdo
Как примечание: для случая с 2D-кодом функция ['findubmat'] (http://www.mathworks.com/matlabcentral/fileexchange/23998-findsubmat) в файловом обмене Matlab имеет довольно хорошие идеи реализации (и код Комментарии). – ojdo
Немного, связанный с первым вопросом от @ojdo: Я думаю, вам нужно определить более точный вывод, который вы хотите в случае 'ndim (sub)