How to iterate until a point satisfies a certain condition?

1 view (last 30 days)
Hi everyone! I need a suggestion for this code. I have this code:
x = [1,2,2,2,1;2,3,2,1,1];
y = [1,1,1,2,2;1,1,2,2,1];
axis equal
Applying this procedure, I obtain that the points that are unique such as (3;1) are removed. The code is this one:
%converts to points with x,y coordinates
points = [x(1,:),x(2,:);y(1,:),y(2,:)];
%initialize test array
repeat_arr = zeros(size(points,2),size(points,2));
for i_points = 1:size(points,2)
%find if a point is repeated excluding itself
repeat_arr(i_points,[1:i_points-1,i_points+1:end]) = all(points(:,i_points)==points(:,[1:i_points-1,i_points+1:end]),1) ;
% now we know for each points if it is repeated
temp = any(repeat_arr,1);
%Reverse the segment to point process so we can mask any segment that does not have a repeated point
edge_mask = all([temp(1:end/2); temp(end/2+1:end)]);
%Create X Y array of segment using out mask
x_edges = x(:,edge_mask);
y_edges = y(:,edge_mask);
axis equal
However, my question is: let us imagine that I have also a point of coordinates (2.5;1) like the one in the figure below, and that using this procedure I am able to remove the point (3;1). After this pruning, I would like the procedure to iterate until also the point (2.5;1) (that now is unique) is excluded and therefore execute as long as only the points in common to two or more segments remain. How can I do this in the most general way possible to be able to adapt it to other more complicated situations with more segments? I think that I need a while loop but, how can I set the condition?

Accepted Answer

Walter Roberson
Walter Roberson on 21 Jun 2022
Edited: Walter Roberson on 24 Jun 2022
You could simplify by using graph() objects
The points to be removed are those with incidence 0 or 1. If you use the adjacency table, the number of nonzero in the row is 0 or 1 for removal
Walter Roberson
Walter Roberson on 29 Jun 2022
x = [1,2,2,2,1,3;2,3,2,1,1,3];
y = [1,1,1,2,2,1;1,1,2,2,1,1.5];
xy = [x(:), y(:)];
uxy = unique(xy, 'rows');
[~, idx1] = ismember([x(1,:); y(1,:)].', uxy, 'rows');
[~, idx2] = ismember([x(2,:); y(2,:)].', uxy, 'rows');
G = graph(idx1, idx2);
plot(G, 'XData', uxy(:,1), 'YData', uxy(:,2))
inG = G;
inxy = uxy;
while true
nodes_to_keep_mask = sum(full(adjacency(inG)),2) >= 2;
nodes_to_remove = find(~nodes_to_keep_mask)
if isempty(nodes_to_remove); break; end
inG = rmnode(inG, nodes_to_remove);
inxy = inxy(nodes_to_keep_mask, :);
plot(inG, 'XData', inxy(:,1), 'YData', inxy(:,2))
nodes_to_remove = 6
nodes_to_remove = 5
nodes_to_remove = 0×1 empty double column vector

Sign in to comment.

More Answers (1)

the cyclist
the cyclist on 21 Jun 2022
You need to code the condition into a while loop.
(I didn't fully understand the condition, so I can't be more specific than that.)




Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by