作为更大算法的一部分,我需要生成相对于指定限制的数组残差。换句话说,我需要生成一个数组,给定someArray
,该数组包含编码someArray
的相应元素超过限制值的量的元素。我最初的倾向是使用分布式比较来确定值何时超过阈值。如下:
# Generate some test data.
residualLimit = 1
someArray = 2.1.*(rand(10,10,3).-0.5)
# Determine the residuals.
someArrayResiduals = (residualLimit-someArray)[(residualLimit-someArray.<0)]
问题是someArrayResiduals
是包含残差值的一维向量,而不是(residualLimit-someArray)
的掩码。如果您检查[(residualLimit-someArray.<0)]
,您会发现它的行为符合预期;它产生了BitArray
。问题是,为什么朱莉娅不允许使用此BitArray
屏蔽someArray
?
使用Bools
将BitArray
中的Ints
投放到int()
并使用.*
进行分发会产生所需的结果,但有点不合适......请参阅以下内容:
# Generate some test data.
residualLimit = 1
someArray = 2.1.*(rand(10,10,3).-0.5)
# Determine the residuals.
someArrayResiduals = (residualLimit-someArray).*int(residualLimit-someArray.<0)
# This array should be (and is) limited at residualLimit. This is correct...
someArrayLimited = someArray + someArrayResiduals
任何人都知道为什么BitArray
无法用来屏蔽数组?或者,是否可以简化整个过程?
谢谢,全部!
答案 0 :(得分:4)
使用逻辑数组进行索引只需选择逻辑数组为true的索引处的元素。您可以将其视为transforming the logical index array with find
before doing the indexing expression。请注意,这可以在数组索引和索引分配中使用。这些逻辑数组通常本身称为掩码,但索引更像是一个选择&#34;操作比夹紧操作。
评论中的建议很好,但您也可以使用带索引编号的逻辑索引来解决您的问题:
overLimitMask = someArray .> residualLimit
someArray[overLimitMask] = residualLimit
在这种情况下,我认为解决此问题最可读的方法是使用min
或clamp
:min(someArray, residualLimit)
或clamp(someArray, -residualLimit, residualLimit)