对于大小为20x30的地理网格,我有两个(温度)变量:
大小为20x30x100的数据A
和threshold
大小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
循环的正确方法是什么?
有什么其他选择吗?
感谢您的帮助!
答案 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