Listing elements from one matrix to another

4 vues (au cours des 30 derniers jours)
Enthusiasten
Enthusiasten le 10 Déc 2019
Modifié(e) : Enthusiasten le 11 Déc 2019
Hello all,
I have a 500 by 1500 matrix.
As an example I got A, a 3 by 9 matrix. The elements displayed are coordinates in form of x y z x y z ...
A = [ 0 0 0 2 1 0 0 0 0; 1 2 0 0 0 0 3 2 0; 0 0 0 2 3 1 0 0 0 ];
I want all relevant elements (x/=0) now listed as below. Also, I do not want any row containg only zeros.
B = [2 1 0; 1 2 0; 3 2 0; 2 3 1]
The order is not important. It is just important that these x y z coordinates stick together and every new point gets a new row.
What I got so far is following code.
for i=1:size(A,1)
for j=1:3:size(A,2)-2
if A(i,j)>0
B(:,j)=A(i,j);
B(:,j+1)=A(i,j+1);
B(:,j+2)=A(i,j+2);
else ;
end
end
end
As a result I get following code below.
B = [1 2 0 2 3 1 3 2 0]
I noticed, that this loop is overwriting numbers of prevoius rows in the same column.
Kind Regards

Réponse acceptée

Gatech AE
Gatech AE le 10 Déc 2019
The formatting in the example you gave us did not translate well; however, the best way to do this can avoid for loops entirely. Using the dimensions of the true matrix, where the columns are a multiple of three, we can do the following.
% Create a column vector of all x,y,z values regardless of matrix size
x = reshape(A(:,1:3:end),[],1);
y = reshape(A(:,2:3:end),[],1);
z = reshape(A(:,3:3:end),[],1);
% Clean up cases where x = 0 with logical indexing, and B is the result of concatenation
mask = x~=0;
B = [x(mask) y(mask) z(mask)];
  1 commentaire
Enthusiasten
Enthusiasten le 11 Déc 2019
Modifié(e) : Enthusiasten le 11 Déc 2019
Thanks four your answer and your explanation. It worked perfectly. I know this was an easy question, but since my brain stuck in for-loops, I forgot to think 'out of the box'.

Connectez-vous pour commenter.

Plus de réponses (1)

JESUS DAVID ARIZA ROYETH
JESUS DAVID ARIZA ROYETH le 10 Déc 2019
A = [0 0 0 2 1 0 0 0 0; 1 2 0 0 0 0 3 2 0; 0 0 0 2 3 1 0 0 0];
B=reshape(A',3,[])';
B(sum(B,2)==0,:)=[]
  1 commentaire
Enthusiasten
Enthusiasten le 11 Déc 2019
Thanks four your answer! It worked like 'Gatech AE' answer perfectly.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by