У меня есть облако точек, состоящее из 37817 трехмерных вершин ( данные здесь ). Для каждой вершины i
я вычисляю всех соседей в пределах 15 мм (NeighborVert{i}
). Сфера подходит с использованием этих соседей через sphereFit
( исходный код ). Квадратное расстояние каждого идентифицированного соседа до поверхности сферы, обозначенное epsilon{i}(j)
, рассчитывается для количественного определения остатка каждого соседа в подобранной сфере. Затем я суммирую все значения в пределах epsilon{i}
по j
и сохраняю результат как E(i)
, который измеряет общее соответствие сферы соседям вершины i
. Вышеописанный процесс реализован с помощью кода MATLAB, приведенного ниже:
T = readtable("<path>\Vertices.xlsx", 'ReadVariableNames',false);
Vertices = table2array(T);
Vertfmt = pointCloud(Vertices);
radius = 15;
for i = 1:size(Vertices, 1)
[NeighborIndex{i}] = findNeighborsInRadius(Vertfmt, Vertices(i,:), radius);
NeighborVert{i} = Vertices(NeighborIndex{i},:);
[center(i, :), r(i)] = sphereFit(NeighborVert{i});
for j = 1:length(NeighborIndex{i})
epsilon{i}(j) = abs((NeighborVert{i}(j, 1) - center(i, 1))^2 + (NeighborVert{i}(j, 2) - center(i, 2))^2 + (NeighborVert{i}(j, 3) - center(i, 3))^2 - r(i)^2);
E(i) = sum(epsilon{i}(j));
end
end
epsilon{i}
должен содержать несколько значений, поскольку сохраняется квадрат всех соседей вершины i
до поверхности подобранной сферы. Тем не менее, мой результат показал, что каждый epsilon{i}
содержит только 1 значение. Как я могу сохранить все epsilon{i}(j)
с epsilon{i}
во время каждой итерации?
Кроме того, мой код для E(i)
правильно суммируется по j
для всех epsilon{i}(j)
с?