# assigning points to clusters using index array

2 views (last 30 days)
Tibo Huyers on 7 Mar 2022
Commented: Max Alger-Meyer on 7 Mar 2022
I'm trying to cluster a point cloud (nx2 array with x and y coordinate) based on the distance of the point to a line. For example:
points = [1 5; 2 6; 4 8]
points = 3×2
1 5 2 6 4 8
Using a for loop i have already detemined what line each point is closest to. The for loop puts an index in an nx1 array that represents the cluster/line that point belongs to. The amount of lines is variable. With two possible lines this array for the above points might look like this:
clusterIndex = [1; 2; 1]
clusterIndex = 3×1
1 2 1
Using these two arrays I want to cluster the points with x and y coordinates seperatly. Where the first column represents the first cluster and so on. Resulting in this:
x = [1 2; 4 0]
x = 2×2
1 2 4 0
y = [5 6; 8 0]
y = 2×2
5 6 8 0
Using the list of indices I can't get the points sorted in clusters. If there is a better way instead of using the indices that would also be apreciated.

Max Alger-Meyer on 7 Mar 2022
So here is what you asked for using the nnz function:
%given quantities
points = [1 5; 2 6; 4 8];
clusterIndex = [1; 2; 1];
x = zeros(1,max(clusterIndex));
y = zeros(1,max(clusterIndex));
%Outputs:
for i = 1:size(points,1)
x(nnz(x(clusterIndex(i)))+1,clusterIndex(i)) = points(i,1);
y(nnz(y(clusterIndex(i)))+1,clusterIndex(i)) = points(i,2);
end
%Here are the results:
x
x = 2×2
1 2 4 0
y
y = 2×2
5 6 8 0
This method uses the nnz() function which identifies how many nonzero elements there are in an array and adds 1 to that number to determine which row a given x or y coordinate should be placed in.
Max Alger-Meyer on 7 Mar 2022
Yep, sorry about that. Forgot to include the colon but yes you are correct because we only want to identify the number of nonzero elements in the corresponding column.

Davide Masiello on 7 Mar 2022
points = [1 5; 2 6; 4 8];
N = size(points,1);
n = N+mod(N,2);
x = zeros(1,n);
y = x;
x(1:N) = points(:,1);
y(1:N) = points(:,2);
x = reshape(x,2,2);
y = reshape(y,2,2);
Davide Masiello on 7 Mar 2022
Sorry, I see the point now.

R2021b

### Community Treasure Hunt

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

Start Hunting!