2016-04-30 2 views
1

Учитывая куб NxNxN (изображение), как я могу найти все блоки 2x2x2 в кубе NxNxN? конечно, если N четно, мы можем найти квадраты 2x2x2 без перекрытия, но когда N является нечетным, между некоторыми ячейками 2x2x2, найденными в более крупном кубе, происходит перекрытие.Как найти маленькие кубики в большом кубе в MATLAB?

Так,

1- Как я могу найти все непересекающуюся 2x2x2 коробки в большей NxNxN куба, где N является даже?

вход: NxNxN куб выход: все возможные непересекающиеся 2x2x2 кубы.

2- Как я могу найти все перекрытые квадраты 2x2x2 в более большом кубе NxNxN, где N равно нечетным? На этот раз перекрывающиеся области в блоках 2x2x2 должны быть равны нулю во время вторых (или более) посещений; то есть каждую перекрываемую область следует посещать (подсчитывать) один раз не более.

вход: NxNxN куб выход: все возможные перекрывается 2x2x2 кубы с нулевыми значениями для перекрывающихся вокселей в 2 или более посещений.

+0

Вы всегда делаете двойные сообщения? https://de.mathworks.com/matlabcentral/answers/281798-how-to-find-all-possible-small-boxes-e-g-2x2x2-and-their-overlaps-within-a-bigger-nxnxn-cube – tim

ответ

1

Я дам вам ответ для части, где N равно. Остальное можно легко адаптировать, я надеюсь, что вы можете сделать это сами :-) Или, по крайней мере, попробуйте - если у вас проблемы, просто возвращайтесь к нам.

У меня больше нет MATLAB, поэтому я надеюсь, что это не будет ошибкой опечатки. Но идея должна быть ясна:

% 
N = 10; 

% First create all possible starting coordinates of 2x2x2 cubes within the big cube: 
coords = 1:2:(N-1); % could easily be adapted to other small-cube sizes like 3x3x3 if you want to... 

% Now create all possible combinations of starting-coordinates in every direction (as it is a cube, the starting points in x, y, z directions are the same): 
sets = {coords, coords, coords}; 
[x y z] = ndgrid(sets{:}); 
cartProd = [x(:) y(:) z(:)]; % taken from here: http://stackoverflow.com/a/4169488/701049 --> you could instead also use this function: https://www.mathworks.com/matlabcentral/fileexchange/10064-allcomb-varargin- which generates all possible combinations 

% Now cartProd contains all possible start-points of small cubes as row-vectors. If you want, you can easily calculate the corresponding vectors of end-points by simply adding +1 to every entry which will effectively yield a small-cube size of 2. If you want to further modify it to support e.g. 3x3x3 cubes, simply add +2 to every dimension. 
endPoints = cartProd+1; 

% E.g.: the first small cube starts at [x,y,z] = cartProd(1,:) and ends at [x_e, y_e, z_e] = endPoints(1,:). 

Удачи :-)

Подсказка: для нечетного большого куба -> Просто относиться к нему как равномерно размера куба, например обработайте куб 9x9x9 как 10x10x10, возьмите мой алгоритм сверху, а затем переместите самые внешние мелкие кубики на один шаг в центр. Это означает, что возьмите маленькие кубы с наибольшей координатой x, y или z и вычитайте 1 в этом направлении. Чтобы исходная координата для всех маленьких кубов с x_max = 9 была изменена на x = 8. Тогда то же самое для y_max = 9 и z_max = 9.

Смежные вопросы