How to extract vertices from a matrix.
Mostrar comentarios más antiguos
Hi everyone
I wonder if you can help me with a problem I'm having.
Right now I have a matrix which is 40x3 and contains nodal points related to triangles making each row a triangle. I'm trying to make a different matrix which would just contain two columns, with the nodal points associated with a vertex. For example:
B(1,1)=A(1,1);
B(1,2)=A(1,2);
B(2,1)=A(1,2);
B(2,2)=A(1,3);
B(3,1)=A(1,3);
B(3,2)=A(1,1);
Now I could continue doing it that way to make the matrix I want, but this code will be used many times and the dimensions of the matrices will change so I've been trying to find a way to do it in a for loop, or something of the sort.
Any help would be much appreciated :)
11 comentarios
Massimo Zanetti
el 29 de Sept. de 2016
Editada: Massimo Zanetti
el 29 de Sept. de 2016
It important to know how you want to store also the other points.. Are you assuming that the final B matrix will be 3 times tall than A?
Something like this
A = [ x1, x2, x3;
y1, y2, y3;
...
z1, z2, z3];
B = [ x1, x2;
x2, x3;
x3, x1;
y1, y2;
y2, y3;
y3, y1;
....
z1, z2;
z2, z3;
z3, z1];
??
Meghan
el 29 de Sept. de 2016
KSSV
el 29 de Sept. de 2016
What is the logic behind converting 40X3 to 40X2?
Meghan
el 29 de Sept. de 2016
Okay..you are dealing with unstructured mesh, you have coordinates and nodal connectivity data. Can't you get this information from nodal connectivity data? As you want the respective nodal points of vertices in A, won't B have three columns?
David Goodmanson
el 29 de Sept. de 2016
Suppose you create an index vector
ind = [1 2 2 3 3 1]
which is the same as your column index for A in your original posting. The matrix
C = A(:,ind)
concatenates the columns of A in the correct order to make the pairs you want, its first row being 13972 13589 13589 13971 13971 13972 but the pairs need to be stacked on top of each other. The 'reshape' command will do this but it reads elements out columnwise, so it's necessary to do some transposing back and forth with ':
B = reshape(C',2,120)'
Image Analyst
el 29 de Sept. de 2016
Attaching a diagram or screenshot would help us visualize things.
David Goodmanson
el 30 de Sept. de 2016
not sure if previous comment is addressing my comment, but
A =
4 5 6
10 11 12
22 23 24
36 37 38
>> ind = [1 2 2 3 3 1]; C = A(:,ind)
C =
4 5 5 6 6 4
10 11 11 12 12 10
22 23 23 24 24 22
36 37 37 38 38 36
>> C'
ans =
4 10 22 36
5 11 23 37
5 11 23 37
6 12 24 38
6 12 24 38
4 10 22 36
>> D = reshape(C',2,12) % reads C' out columnwise
D =
4 5 6 10 11 12 22 23 24 36 37 38
5 6 4 11 12 10 23 24 22 37 38 36
>> B = D'
B =
4 5
5 6
6 4
10 11
11 12
12 10
22 23
23 24
24 22
36 37
37 38
38 36
David Goodmanson
el 30 de Sept. de 2016
I'm glad you liked this solution and I will post it as an answer. Thank you for mentioning that idea.
The great thing about Matlab is that its syntax simplifies things compared to 'for' loops and such, and you can look at matrix calculations in an almost pictorial way.
Respuesta aceptada
Más respuestas (1)
Andrei Bobrov
el 30 de Sept. de 2016
Editada: Andrei Bobrov
el 30 de Sept. de 2016
A = [...
4 5 6
10 11 12
22 23 24
36 37 38]
B = reshape([A.',circshift(A,[0,-1]).'],[],2);
Categorías
Más información sobre Matrix Indexing en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!