Ну, я не знаю, как описать мою проблему с заголовком, я надеюсь, что тот, который я получил, верен.Индекс индекса Voxel - обнаружение «вне границ» в 26 соседнем доступе с линейной индексацией
У меня есть матрица (M
в приведенном ниже примере), который представляет собой изображение 3D, состоит, в данном случае, по 11x11x11 вокселей (я сделал это логично только для простоты, и размер это всего лишь пример и).
В моем коде, я должен достичь 26 соседей некоторых вокселей, и для этого я использую некоторые фантазии линейной индексации найти в: http://www.mathworks.com/matlabcentral/answers/86900-how-to-find-all-neighbours-of-an-element-in-n-dimensional-matrix
Проблема в том, что если point
находится в «границе» из M
Пробуется доступ к некоторым значениям вне границ, и это приведет к возникновению ошибки.
Чтобы решить эту проблему, хороший подход должен был бы создать границу вокруг M
делает его +2 размера в каждом измерении, и заселить, что с нулями, однако я действительно хотел бы, чтобы избежать изменения M
, как мой код является более сложным, чем тот, который приведен в примере.
Я не могу найти способ сделать это, я немного застрял здесь. Любое предложение?
EDIT: @ Ответ работает, однако мне хотелось бы узнать, существует ли возможное решение с использованием этого метода линейной индексации.
% Example data
M=round(randn(11,11,11))~=0;
% Fancy way of storing 26 neigh indices for good accesing
s=size(M);
N=length(s);
[c1{1:N}]=ndgrid(1:3);
c2(1:N)={2};
neigh26=sub2ind(s,c1{:}) - sub2ind(s,c2{:});
point=[5 1 6];
% This will work unless the point is in the boundary (like in this example)
neighbours=M(sub2ind(s,point(1),point(2),point(3))+neigh26)
'c2 (1: N) = {2};' ... это то, что всегда будет '{2}' или должно быть просто 'point (1)'? – Dan
@ Dan Эти 5 строк для создания рг26 вызывается только один раз. рг26 - разность между линейным индексом и его 26 соседями для заданного размера матрицы 's'. Попробуйте с точкой = [2 2 2]; чтобы проверить его результат. Численное значение - это просто совпадение, позвольте мне изменить это ... –
Не уверен, что я получил это право, поэтому позвольте мне спросить вас: если 'point' находится на границе, у вас будет меньше, чем' 26' соседей, и это будет либо '17' (для одного края), либо' 11' (для одного угла). Итак, каков должен быть результат для таких случаев? Должны ли они быть «17» и «11», или мы должны набивать нулями вокруг M и делать это «26» соседями тоже для этих случаев? – Divakar