2015-02-26 3 views
3

J'ai un tableau en 3 dimensions (10x3x3) dans Matlab et je veux changer toute valeur supérieure à 999 en Inf. Cependant, je veux seulement que cela s'applique à (:,:, 2: 3) de ce tableau.Matlab: Changer des éléments dans une matrice 3D en utilisant des conditions données

Toute l'aide que j'ai trouvée en ligne ne semble s'appliquer qu'à l'ensemble du tableau, ou à une colonne d'un tableau 2D. Je ne sais pas comment l'appliquer à un tableau 3D.

J'ai essayé le code suivant, mais il devient un tableau 69x3x3 après que je l'ai exécuté, et je ne comprends pas pourquoi. J'ai essayé de copier le code de quelqu'un utilisant un tableau 2D, donc je pense juste que je ne comprends pas vraiment ce que fait le code.

A(A(:,:,2)>999,2)=Inf; 
A(A(:,:,3)>999,3)=Inf; 

Répondre

2

Une approche avec logical indexing -

mask = A>999; %// get the 3D mask 
mask(:,:,1) = 0; %// set all elements in the first 3D slice to zeros, 
%// to neglect their effect when we mask the entire input array with it 
A(mask) = Inf %// finally mask and set them to Infs 

autre avec linear indexing -

idx = find(A>999); %// Find linear indices that match the criteria 
valid_idx = idx(idx>size(A,1)*size(A,2)) %// Select indices from 2nd 3D slice onwards 
A(valid_idx)=Inf %// Set to Infs 

Ou encore une autre avec linear indexing, presque identique à celui précédent l'indice valide étant calculé en un étape et donc nous permettant un one-liner -

A(find(A(:,:,2:3)>999) + size(A,1)*size(A,2))=Inf 
+0

Merci. Ils ont tous travaillé avec brio. J'aime particulièrement le one-liner! – emmalgale

+0

@emmalgale Moi aussi! Explorer à travers les approches a conduit à ce dernier! – Divakar