2013-04-04 213 views
1

我遇到以下问题。我有两个矩阵,一个是大小为X的Y矩阵,Y是从DEM文件中获取的一组地形高度,另一个是矩阵X,Y,Z的Z矩阵,每个矩阵的高度值从0到5000米(X,Y )点。Matlab - 在3d矩阵中查找2d矩阵值

我想比较每个(X,Y)点的DEM高度与Z高度值的列并取最接近的值。例如:

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) 

如果我使用的功能“找到”我得到以下错误:

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

有没有解决这个不需要两个for循环?

非常感谢您的帮助!

+0

如果'X'和'Y'保持不变,是不是这个问题会减少到betwenn'Z上的比较数组?原因我期望每个点的坐标在** 2d **和** 3d **表示之间不变。我对吗? – fpe 2013-04-04 10:39:46

+0

是的,对于每个点,它是一个长度为Z的向量和一个值之间的比较。这可以通过'find(height(x,y,:)> dem(x,y))'来完成。不过,我希望同时为整个矩阵提供解决方案,而无需循环X和Y坐标。 – 2013-04-04 10:49:14

回答

2

你可以使用这个bsxfun减少到遍历一个维度:

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

    [returns a 5x10x10 matrix] 
+0

非常感谢!我只是看着这个函数: 'result = bsxfun(@ge,heights,dem);' 它的工作方式和预期的一样。 – 2013-04-04 11:03:31

+0

请注意,您仍在循环播放! – fpe 2013-04-04 11:07:35

+0

不,你不是,除了'bsxfun'无法处理的单个维度...''bsxfun'做了一个'repmat'来使你的单维数据和你的多维数据具有相同的大小,那么整个操作一次。 – wakjah 2013-04-04 11:10:55

0

你只需要定义你的数据为:

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

现在,find(heights > dem, 1) yeilds

ans = 

    3 

这是预期结果,2000索引。

+0

在这个例子中,我给出了矩阵的一个点的值。我的目标是在同一时间为整个(X,Y)点设置。 – 2013-04-04 10:46:24