通过梯度计算数组的值
Calculate values for the array by the gradient
我有一个二维浮点数组,它必须具有标准化的 [0,1] 值,并且在我的例子中代表 "heat map"。每个单元格的值取决于它与地图中心的距离,只有一个轴(垂直或 y)很重要(它看起来很像从中心 up/down 开始的渐变)。中央单元格必须具有最大值 (1),边界上的单元格必须具有最小值 (0)。所以我需要的是一个可以计算每个单元格值的函数。
这是数组中值的示例(红色代表最大值,蓝色代表最小值,颜色可能不遵循渐变,所以不要判断):
这里是我用来初始化数组的代码,我知道所需的函数必须放在某处:
func createBandsForTwoDArray() -> [[Float]] {
let columns = 100
let rows = 100
var twoDArray = Array(repeating: Array(repeating: Float(0), count: columns), count: rows)
for y in 0..<rows {
for x in 0..<columns {
// How to calculate cell value?
let n = magicValueCalculation(x, y)
twoDArray[y][x] = Float(n)
}
}
return twoDArray
}
据我了解,您需要一个函数来 return 归一化值,该值取决于浮动单元格相对于地图中心的距离(越小的值越远;只有一个轴很重要)
大意是:
- 按地图大小划分单元格位置
- 从该值中减去一半 (0.5)
- 通过减法乘以前一个绝对值的两倍得到值
代码:
func createBandsForTwoDArray(columns: Int, rows: Int) -> [[Float]] {
var twoDArray = Array(repeating: Array(repeating: Float(0), count: columns), count: rows)
for y in 0..<rows {
let h = getHeat(pos: Float(y), len: Float(rows)) // Heat needs calculation only once per row
for x in 0..<columns {
twoDArray[y][x] = h
}
}
return twoDArray
}
func getHeat(pos: Float, len: Float) -> Float {
var heat = pos/len-0.5
heat = 1-abs(heat)*2
return heat
}
其中 pos 是单元格的 y 位置,len 是地图高度。此外,由于同一行的成员将具有相同的值,您可以通过只为每行查找一次值来加快您的方法。如果你需要非线性函数,你也可以 pow 结果。
我有一个二维浮点数组,它必须具有标准化的 [0,1] 值,并且在我的例子中代表 "heat map"。每个单元格的值取决于它与地图中心的距离,只有一个轴(垂直或 y)很重要(它看起来很像从中心 up/down 开始的渐变)。中央单元格必须具有最大值 (1),边界上的单元格必须具有最小值 (0)。所以我需要的是一个可以计算每个单元格值的函数。 这是数组中值的示例(红色代表最大值,蓝色代表最小值,颜色可能不遵循渐变,所以不要判断):
这里是我用来初始化数组的代码,我知道所需的函数必须放在某处:
func createBandsForTwoDArray() -> [[Float]] {
let columns = 100
let rows = 100
var twoDArray = Array(repeating: Array(repeating: Float(0), count: columns), count: rows)
for y in 0..<rows {
for x in 0..<columns {
// How to calculate cell value?
let n = magicValueCalculation(x, y)
twoDArray[y][x] = Float(n)
}
}
return twoDArray
}
据我了解,您需要一个函数来 return 归一化值,该值取决于浮动单元格相对于地图中心的距离(越小的值越远;只有一个轴很重要)
大意是:
- 按地图大小划分单元格位置
- 从该值中减去一半 (0.5)
- 通过减法乘以前一个绝对值的两倍得到值
代码:
func createBandsForTwoDArray(columns: Int, rows: Int) -> [[Float]] {
var twoDArray = Array(repeating: Array(repeating: Float(0), count: columns), count: rows)
for y in 0..<rows {
let h = getHeat(pos: Float(y), len: Float(rows)) // Heat needs calculation only once per row
for x in 0..<columns {
twoDArray[y][x] = h
}
}
return twoDArray
}
func getHeat(pos: Float, len: Float) -> Float {
var heat = pos/len-0.5
heat = 1-abs(heat)*2
return heat
}
其中 pos 是单元格的 y 位置,len 是地图高度。此外,由于同一行的成员将具有相同的值,您可以通过只为每行查找一次值来加快您的方法。如果你需要非线性函数,你也可以 pow 结果。