2015-10-12 86 views
0

说,如果我有一个3D阵列:减去矢量

lat = 45:49; 
lon = -116:-110; 
b = rand(5,7,12); 

其中第一维代表纬度,第二维表示经度和第三行表示数据。我打算使用映射工具箱在地图上绘制这三维数据。但是,在此之前,我想找到“B”的数据之间及以下向量的区别:

vals = [2.3,5,6.8,5.4,3.3,12,1.5,4.6,9.8,82,3.3,1]; 

具体而言,我在我的映射的数据我owuld想每个空间数据点计算该向量与b中每个点处数据之间的平均绝对误差。如果这些是两个正常的载体,我会用:

mae = mean(abs(bv - vals)) 

但我不知道如何做到这一点与3D阵列。最终,我的目标是将这个平均绝对误差映射为空间变化。任何人都可以建议如何做到这一点在MATLAB中?

回答

3

使用bsxfun这个(它比repmat更有效):

V = permute(vals, [1,3,2]) %// Make sure that the dimesions 'align' correctly. i.e. 12 elements must go in the thrid dimension to match b 
mae = mean(abs(bsxfun(@minus, b, V)),3) 
0

由于MATLAB不支持broadcasting,您需要创建一个与b相同大小的矩阵,重复值为vals。为了做到这一点,首先需要将vals更改为1x1x12的形状,然后重复5x7次。你可以做到这一点与

values=repmat(permute(vals,[1 3 2]),[5 7 1]); 

现在你可以

mae = mean(abs(bv - values)) 
+1

'bsxfun'是实现更有效的方法在Matlab中广播:http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/ – Dan

+0

@丹它绝对是!我只是不习惯,我期待Divakar会回答:P –