2013-04-04 105 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