2013-04-04 9 views
1

J'ai le problème suivant. J'ai deux matrices, une matrice 2d de taille X, Y avec un ensemble de hauteurs de terrain prises à partir d'un fichier DEM et une matrice 3d de taille X, Y, Z avec des valeurs de hauteur Z de 0 à 5000 mètres pour chacune (X, Y) point.Matlab - Trouver les valeurs matricielles 2d dans la matrice 3d

Je veux comparer, pour chaque point (X, Y), sa hauteur DEM avec la colonne de Z valeurs de hauteur et prendre la plus proche. Par exemple:

dem(1,1) = 1850 %actual height of the terrain at point (1,1) 
heights(1,1,:) = 0, 1000, 2000, 3000, 4000, 5000 %column of heights at point (1,1) 

Si j'utilise la fonction « trouver » j'obtiens l'erreur suivante:

find(heights > dem, 1) 
Error using > 
Number of array dimensions must match for binary array op. 

Est-il une solution à ce qui ne nécessite pas de deux pour les boucles?

Merci beaucoup d'avance pour votre aide!

+0

si '' X' et Y' restent les mêmes, n'est pas la question va être réduite à une comparaison betwenn 'Z 'Arrays? Car je m'attends à ce que les coordonnées de chaque point soient invariantes entre les représentations ** 2d ** et ** 3d **. Ai-je raison? – fpe

+0

Oui, pour chaque point c'est une comparaison entre un vecteur de longueur Z et une valeur. Cela pourrait être fait avec 'find (height (x, y,:)> dem (x, y))' pour chaque point. Cependant je voudrais une solution pour la matrice entière en même temps, sans boucler par les coordonnées X et Y. –

Répondre

2

Vous pouvez réduire à une boucle sur une seule dimension en utilisant bsxfun:

heights = rand(10, 10, 10); 
dem = rand(5, 1); 
bsxfun(@gt, heights(1, :, :), dem) 

    [returns a 5x10x10 matrix] 
+0

Merci beaucoup! Je regardais simplement cette fonction: 'result = bsxfun (@ge, hauteurs, dem);' Cela fonctionne comme prévu. –

+0

soyez conscient que vous êtes en boucle quand même! – fpe

+0

Non, sauf pour la dimension unique que 'bsxfun' ne peut pas gérer ...' bsxfun' fait un 'repmat' pour donner à vos données unidimensionnelles la même taille que vos données multidimensionnelles, puis le toute l'opération à la fois. – wakjah

0

Il vous suffit de définir vos données:

dem(1,1) = 1850; 
heights(1,1,:) = [0; 1000; 2000; 3000; 4000; 5000]; 

Maintenant, find(heights > dem, 1) yeilds

ans = 

    3 

qui est le résultat attendu, l'indice de 2000.

+0

Dans l'exemple, je donne des valeurs d'un seul point de la matrice. Mon but est de le faire pour l'ensemble des points (X, Y) en même temps. –

Questions connexes