Я не уверен на 100%, что это именно то, о чем вы просите (поскольку я не совсем понимаю, что делает ваш код), но, возможно, методология даст некоторое вдохновение.
Я не сгенерировал "логический" A
, а был случайным, и я установил внутри куб, равный 1. Аналогично для se
. Я использую meshgrid
, чтобы получить массивы, соответствующие индексам, и использую mask
логического индексирования. (возможно, мой mask
это то, что у вас есть для A
в первую очередь?)
A = rand(255,255,255);
A(40:50, 23:33, 80:100) = 1;
mask = (A==1);
[I,J,K] = meshgrid(1:255);
se = rand(13,13,13);
se(4:6, 3:7, 2:8) = 1;
se_mask = (se==1);
[se_I, se_J, se_K] = meshgrid(1:13);
Здесь я предполагаю, что куб в A
достаточно далеко от любого ребра (скажем, 13 пробелов), поэтому мы не получим c
, d
или e
больше, чем 255.
Я сплющил mask
в вектор-строку, поэтому find
дает один индекс ii
, который мы можем использовать для ссылки на любую точку в A
, затем на исходные i
, j
и k
индексы в I(ii)
, J(ii)
и K(ii)
соответственно. Аналогично для se_I
и т. Д.
temp = zeros(255, 255, 255);
for ii=find(mask(:).')
for jj=find(se_mask(:).')
c = I(ii) + se_I(jj);
d = J(ii) + se_J(jj);
e = K(ii) + se_K(jj);
temp(c,d,e) = 1;
end % for
end % for
Матрицы I
, J
, K
, se_I
, se_J
и se_K
являются регулярными, поэтому, если их создание / хранение становится узким местом, вы можете написать функции для их замены. Матрица temp
может быть очень разреженной в зависимости от размера ваших кубиков, поэтому вы можете использовать sparse
.
Я не сравнивал время с вашим решением.