Group 3 * 3 (2d) or 3 * 3 * 3 (3d) coordinates into square blocks?

2 visualizzazioni (ultimi 30 giorni)
Hi all,
This question might be quite complex. Imagine there is a 3D block like this with the Cartesian coordinates:
There are 27 nodes, corresponding coordinates are (first column denotes a linear index):
K>> coords
coords =
1 -1 -1 -1
2 -1 0 -1
3 -1 1 -1
4 0 -1 -1
5 0 0 -1
6 0 1 -1
7 1 -1 -1
8 1 0 -1
9 1 1 -1
10 -1 -1 0
11 -1 0 0
12 -1 1 0
13 0 -1 0
14 0 0 0
15 0 1 0
16 1 -1 0
17 1 0 0
18 1 1 0
19 -1 -1 1
20 -1 0 1
21 -1 1 1
22 0 -1 1
23 0 0 1
24 0 1 1
25 1 -1 1
26 1 0 1
27 1 1 1
Now I'd like to group these 27 coordinates into small sub-blocks. I labelled these sub-blocks with red numbers, but it's not a must to follow the label sequence. The results should be:
block1:
-1 -1 -1
0 -1 -1
0 -1 0
-1 -1 0
-1 0 -1
0 0 -1
0 0 0
-1 0 0
block2
0 -1 -1
1 -1 -1
1 -1 0
0 -1 0
0 0 -1
1 0 -1
1 0 0
0 0 0
block3
......
Also, the code should work for any dimension, i.e. if there is a 2D square:
The code should be able to sort the coordinates into 4 sub-squares.
Can anyone help me with it? Or is there a toolbox developed for this kind of problem? Really appreciate it!

Risposta accettata

Matt J
Matt J il 10 Nov 2017
Modificato: Matt J il 10 Nov 2017
The result is the cell array "blocks":
dim=size(coords,2)-1;
L=(dec2bin(0:2^dim-1)-'0')*2-1;
N=size(L,1);
blocks=cell(1,N);
T=coords(:,2:end);
for i=1:N
idx=all(bsxfun(@times,T,L(i,:))>=0,2);
blocks{i}=T(idx,:);
end
  3 Commenti
Matt J
Matt J il 10 Nov 2017
Modificato: Matt J il 10 Nov 2017
In each block, you could compute the angle of the points using atan2() and then sort them according to that.

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Shifting and Sorting Matrices in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by