MATLAB Answers

Get certain matrix entries to a new matrix

2 views (last 30 days)
Rene
Rene on 26 Aug 2020
Commented: dpb on 27 Aug 2020
Hello
I need to create a loop that reads certain data from a matrix and put it into a new matrix.
The matrix is for example:
2003 2004 0 0 0
2004 2005 0 0 0
2005 4005 0 0 0
3001 3002 5002 6002 0
Now I want to automatically create a new matrix that gives me all the "connections" like so:
2003 2004
2004 2005
2005 4005
3001 3002
3001 5002
3001 6002
Zeros should be ignored in the new matrix. The first column is always filled with a number.
Any idea how to do this? I'm thinking of a while loop but I can't figure out how.

  2 Comments

tareq ALTALMAS
tareq ALTALMAS on 26 Aug 2020
can you please explain more
for example 2nd line how it became 2005 2005 and the last 2 lines also
Rene
Rene on 26 Aug 2020
There was one mistake in the second matrix (as you saw with the 2005 2005).
The numbers are measurement points on a model. The first table/matrix gives the information which point connects to others.
Later all of the points will get x,y and z values to then plot a vector from point to point to get a 3d line model.
Therefore I need to extract the connections.
2003 connects to 2004 and no other
3001 connects to 3002, 5002 and 6002.
Is it any clearer now?

Sign in to comment.

Accepted Answer

dpb
dpb on 26 Aug 2020
Sometimes, just "dead ahead" is as good as any...
nAdd=sum(A~=0,2)-2; % number of connections beyond the one for each first node
V=zeros(size(A,1)+sum(nAdd),2); % preallocate for final array
% the engine...
j=0;
for i=1:size(A,1)
j=j+1;
V(j,:)=A(i,1:2);
for k=1:nAdd(i)
j=j+1;
V(j,:)=[A(i,1),A(i,2+k)];
end
end
above results in
>> V
V =
2003 2004
2004 2005
2005 4005
3001 3002
3001 5002
3001 6002
>>

  3 Comments

Rene
Rene on 26 Aug 2020
Thank you very much. This pretty much worked out.
The only little problem is, that in my full matrix are some points that are a "dead end". So they have no connection at all. They stil appear in the new matrix with a zero.
dpb
dpb on 26 Aug 2020
You mean there's one or more nodes with a zero in column 2? If that's so, just remove them first...
A(A(:,2)==0)=[];
before the previous code.
Or after gets to same end but first is more efficient in reducing the size quicker.
dpb
dpb on 27 Aug 2020
Or, save only those w/ a node connection first...
A=A(A(:,2)~=0);

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!

Translated by