将2D阈值应用于3D阵列

时间:2015-12-15 16:21:17

标签: matlab multidimensional-array threshold temperature

对于大小为20x30的地理网格,我有两个(温度)变量:

大小为20x30x100的数据Athreshold大小20x30

我想将阈值应用于数据,即在A中删除高于threshold的值,每个网格点都有自己的阈值。由于这会为每个网格点提供不同数量的值,我想用零填充其余的值,以便生成的变量(我们称之为B)的大小也是20x30x100。

我正在考虑做这样的事情,但是循环出了问题:

B = sort(A,3); %// sort third dimension in ascending order
threshold_3d = repmat(threshold,1,1,100); %// make threshold into same size as B

for i=1:20
    for j=1:30
        if B(i,j,:) > threshold_3d(i,j,:); %// if B is above threshold
          B(i,j,:); %// keep values
        else
          B(i,j,:) = 0; %// otherwise set to zero
        end
    end
end

循环的正确方法是什么?
有什么其他选择吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用bsxfun提供更有效的解决方案,该解决方案将在内部处理repmat的复制,如此 -

B = bsxfun(@times,B,bsxfun(@gt,B,threshold))

更有效的解决方案可能是使用logical indexing设置False创建的掩码中的bsxfun(gt元素,即使用{{1} True的元素在bsxfun(@le中为零,从而避免使用B,这对于大型多维数组而言可能是位昂贵的,就像这样 -

bsxfun(@times

B(bsxfun(@le,B,threshold)) = 0 作为关系操作,使用Note on efficiency :进行矢量化操作将提供内存和运行时效率。这里讨论了内存效率部分 - BSXFUN on memory efficiency with relational operations并且已经在此处研究了性能数字 - Comparing BSXFUN and REPMAT

示例运行 -

bsxfun