将任意值(在一定范围内)“映射”到数组的离散值的常用方法是什么?
基本上我想做的是为一系列离散输入值 x
预先计算一个复杂函数 x = f(x)
并存储每个输出值 f(x)
在另一个数组 fx
中,所以有两个 vector :
x
- 离散输入值和fx
- 对应的离散输出值
现在对于范围为 x
的任意值,我想从 fx
获取相应的输出,例如。 G。对于值 x1 = 42
和 vector
x = [ 30, 35, 40, 45, 50];
fx = [1.3, 1.8, 2.9, 4.5, 7.3];
函数可能会返回
fx1 = 4.5
- 以x
为上限映射到fx
fx1 = 2.9
- 映射到fx
,取x
中最接近的值
fx1 = 3.54
- 映射到fx
进行简单的线性化
fx1 = fxa + (fxb-fxa)/(xb-xa) * (x1-xa)
fx1 = 2.9 + (4.5-2.9)/(45-40) * (42-40)
函数* 应该非常快,因为它替代了在紧密循环中调用“真实”函数。用于将上面列出的案例之一付诸实践的第一次尝试如下:
%% GET AT
% Retrieve f(x).
%
% * Synopsis: getAt (x, input_map, output_map)
% * Input : x - function input
% : input_map - array with precomputed input values
% : output_map - array with precomputed output values
%
% * Output : fx - function output
%
function fx = getAt (x, input_map, output_map)
n = length(input_map);
jj = length(find(input_map < x));
if (jj >= n)
fx = 0;
else
fx = output_map(jj+1);
end
end
但是我更想寻找 C 解决方案,因为循环也将在 C 中。
*.. 只是在寻找实现它的方法,而不是像在语言构造中那样寻找函数。
最佳答案
我会使用线性插值(您的解决方案 3)和恒定外推法,即低于 30 的所有内容映射到 1.3,所有超过 50 的内容映射到 7.3。时间紧迫的部分可能是找到正确的数组索引。
具体的实现取决于采样数组的大小以及输入值的分布方式。例如:
- 如果您的数组很小,或者如果您希望在输入范围的下端有很多值,线性搜索可能足够快。
- 如果您的数组很大并且您的输入在范围内均匀分布,二分查找可能会更好。
- 如果您的输入样本是等距的,lookup is just one division with a floor function or integer conversion,所以这可能是最好的方法。
- 您可以预先计算每段的斜率,这样您就不必每次都计算常量
(fxb-fxa)/(xb-xa) * (x1-xa)
.
很多“ Jade 米”。使用您的用例分析一些实现应该有助于您决定如何准确地实现查找功能。
关于c - 将值映射到数组的通用解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25820232/