c - 将值映射到数组的通用解决方案

标签 c arrays matlab

任意值(在一定范围内)“映射”到数组的离散值的常用方法是什么?

基本上我想做的是为一系列离散输入值 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];

函数可能会返回

  1. fx1 = 4.5 - 以x为上限映射到fx
  2. fx1 = 2.9 - 映射到 fx,取 x
  3. 中最接近的值
  4. 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/

相关文章:

C typedef 枚举编译

c - C 代码中的时间限制超出错误。我如何克服它?

c - 我如何操纵位从0x00到0x34,以便创建由这些值表示的卡座

arrays - 如何在 MATLAB 中基于索引向量添加矩阵的行?

arrays - 如何定义一个可以在matlab中获取数组输入的二维离散delta函数

c - 将数组中的 2 个连续整数计算为字符

c - 我正在研究图的连通性。为什么我会遇到段错误 : 11?

java - 想不出移动数组的方法

php - 谁能用 PHP -> $a{0} = "value"解释这个数组声明

matlab - 立体图 : Decoding an image from a pattern