Borrar filtros
Borrar filtros

print values in one matrix to another

1 visualización (últimos 30 días)
k
k el 16 de Abr. de 2020
Comentada: Tommy el 16 de Abr. de 2020
Hi,
I have very large matricies but will abbreviate them as best as possible here.
I have a matrix called "connectivity" which contains 5884 rows (total_elements = 5884) and 5 columns. The first column is the element number, the second column is node 1 and the third column is node 2:
connectivity(total_elements, 5);
connectivity(:,1) = 1:total_elements;
connectivity(:,2) = N1;
connectivity(:,3) = N2;
making this matrix look like
1 900 175
2 175 200
3 200 145
4 145 300...
I have a second matrix "C" which has the x and y coordinates for each of the nodes.
NodeNumber Xcomponent Ycomponent
...
I need to write a loop that will search matrix "C" for the correct x and y coordinates for each node and create a new matrix "length," which looks like the following:
length = zeros(total_elements, 7);
length(:,1) = 1:total_elements
length(:,2) = N1;
length(:,3) = N2;
length(:,4) = x1; %x coordinate of node 1
length(:,5)=x2; %x coordinate of node 2
length(:,6)=y1; %y coordinate of node 1
legnth(:,7)=y2; %y coordinate of node 2
being:
element# N1 N2 x1 x2 y1 y2
  2 comentarios
Walter Roberson
Walter Roberson el 16 de Abr. de 2020
Is it mandatory to use a for loop? This is something that is easily vectorized.
k
k el 16 de Abr. de 2020
No, a for loop isn't necessary. I essentially just need to match values from one matrix to another and print them into a final matrix.
Ex:
matrix A
node # xcoordinate ycoordinate
1 0.23 0.5
2 2.3 6.2
3 2.1 3.2
matrix B
element# N1 N2
1 2 3
2 3 1
3 2 1
matrix C, which I'm trying to create
element# N1 xcoordinate ycoordinate N2 xcoordinate yycoordinate
1 2 2.3 6.2 3 2.1 3.2
2 3 2.1 3.2 1 0.23 0.5
3 2 2.3 6.2 1 0.23 0.5
Hopefully this makes more sense! Again, I need to scale this to where the total number of elements is 5884 and the number of nodes is 2000.

Iniciar sesión para comentar.

Respuesta aceptada

Tommy
Tommy el 16 de Abr. de 2020
Editada: Tommy el 16 de Abr. de 2020
Let me know if this works:
length = [connectivity, zeros(total_elements, 4)];
for i = 1:total_elements
length(i, [4 6]) = C(C(:,1)==connectivity(i,2),[2 3]);
length(i, [5 7]) = C(C(:,1)==connectivity(i,3),[2 3]);
end
(edit) If you want to avoid the loop, and to match the format you've given in the comments:
[~,i] = ismember(connectivity(:,[2 3]),C(:,1));
length = [connectivity(:,[1 2]), C(i(:,1),[2 3]), connectivity(:,3), C(i(:,2),[2 3])];
Either way should work for any number of elements and nodes, provided your connectivity and C matrices are formatted as you've described.
  8 comentarios
k
k el 16 de Abr. de 2020
It worked!! Thank you so so much!!
Tommy
Tommy el 16 de Abr. de 2020
Oh awesome! Happy to help!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by