MATLAB Answers

Get certain matrix entries to a new matrix

조회 수: 2(최근 30일)
Rene
Rene 26 Aug 2020
댓글: dpb 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

tareq ALTALMAS
tareq ALTALMAS 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 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?

댓글을 달려면 로그인하십시오.

채택된 답변

dpb
dpb 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

Rene
Rene 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 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 27 Aug 2020
Or, save only those w/ a node connection first...
A=A(A(:,2)~=0);

댓글을 달려면 로그인하십시오.

추가 답변(0개)

Community Treasure Hunt

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

Start Hunting!

Translated by