How to extract vertices from a matrix.

5 Ansichten (letzte 30 Tage)
Meghan
Meghan am 29 Sep. 2016
Beantwortet: David Goodmanson am 30 Sep. 2016
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 Kommentare
Meghan
Meghan am 30 Sep. 2016
Bearbeitet: Meghan am 30 Sep. 2016
That worked! Thank you so much :) You're an absolute star! It seems really quite simple, I think I was making it a lot more complex in my head than it needed to be!
p.s. If you put write it as an answer I'll accept it :)
David Goodmanson
David Goodmanson am 30 Sep. 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.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

David Goodmanson
David Goodmanson am 30 Sep. 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. Then for the sample matrix
A =
4 5 6
10 11 12
22 23 24
36 37 38
the command
C = A(:,ind)
concatenates the columns of A in the correct order to make the pairs you want:
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
but for matrix B 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 using the single quote operator:
B = reshape(C',2,120)'
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
The comments section for this question shows some intermediate matrices in this process.

Weitere Antworten (1)

Andrei Bobrov
Andrei Bobrov am 30 Sep. 2016
Bearbeitet: Andrei Bobrov am 30 Sep. 2016
A = [...
4 5 6
10 11 12
22 23 24
36 37 38]
B = reshape([A.',circshift(A,[0,-1]).'],[],2);

Kategorien

Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by