3-мерные матрицы - PullRequest
       3

3-мерные матрицы

1 голос
/ 08 июля 2011

У меня есть трехмерная матрица 4 на 4 на 4, и я считаю ее круглой (поэтому 4-й элемент строки закрывается с 1-м, и то же самое касается столбцов и страниц).

мы знаемчто в 3D каждая точка имеет ровно 26 соседей, которые можно указать как (i, j, k-1) (i, j, k + 1) и т. д., но я не уверен, как заставить matlab знать, что a (i, j, k-1) сосед точки (1,1,1) не является (1,1,0), но (как круговая) (1,1,4), а также этой точкой (2,4,3)соседом (i, j + 1, k) является не (2,5,3), а (2,1,3).Другими словами, КАК СДЕЛАТЬ ЕГО КРУГЛЫМ?

Спасибо

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Идея в том, чтобы использовать функцию MOD , как объяснено @ MartinB . Вот некоторый код для эффективного вычисления соседей каждой точки в вашем кубе 4x4x4:

%# generate X/Y/Z coordinates of each point of the 4x4x4 cube
sz = [4 4 4];                            %# size of the cube along each dimension
[X Y Z] = ndgrid(1:sz(1),1:sz(2),1:sz(3));
coords = [X(:) Y(:) Z(:)];

%# generate increments to get the 26 neighbors around a 3D point
[X Y Z] = ndgrid([-1 0 1], [-1 0 1], [-1 0 1]);
nb = [X(:) Y(:) Z(:)];
nb(ismember(nb,[0 0 0],'rows'),:) = [];  %# remove the row [0 0 0]

%# for each 3D point, compute its neighbors
allNeighbors = zeros([size(nb,1) 3 size(coords,1)]);
szMod = repmat(sz, [size(nb,1) 1]);
for i=1:size(coords,1)
    cc = bsxfun(@plus, nb, coords(i,:)); %# find 26 neighbors of coords(i,:)
    cc = mod(cc-1,szMod)+1;              %# wrap around circularly

    allNeighbors(:,:,i) = cc;            %# save them for later processing
end

Порядок генерируемых соседей следующий:

>> nb
nb =
    -1    -1    -1      %# read as: (i-1,j-1,k-1)
     0    -1    -1      %# read as: (i,j-1,k-1)
     1    -1    -1      %# ...
    -1     0    -1
     0     0    -1
     1     0    -1
    -1     1    -1
     0     1    -1
     1     1    -1
    -1    -1     0
     0    -1     0
     1    -1     0
    -1     0     0
     1     0     0
    -1     1     0
     0     1     0
     1     1     0
    -1    -1     1
     0    -1     1
     1    -1     1
    -1     0     1
     0     0     1
     1     0     1
    -1     1     1
     0     1     1
     1     1     1
1 голос
/ 08 июля 2011

MATLAB не имеет встроенных средств для этого, но вы можете использовать функцию mod (модуль) при доступе к вашей матрице для достижения желаемого эффекта. Чтобы проиллюстрировать это на векторе:

v=[1 2 3];
i=5;
result=v(mod(i-1, length(v))+1);
% assigns 2 to 'result'

Возможно, вы захотите написать функцию, которая инкапсулирует "круговой" доступ к матрице, чтобы вы могли выполнять вычисления индекса только в одном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...