缩放和插入数组[关闭]

Posted

技术标签:

【中文标题】缩放和插入数组[关闭]【英文标题】:Scale and interpolate an array [closed] 【发布时间】:2019-10-07 08:16:27 【问题描述】:

我有一个简单的一维数组,其中包含一些数字(不代表与图像有关的任何内容)和四个包含例如的元素

1 5 9 13

现在我想将这个数组缩放 3 倍到 12 个元素的大小,并线性插入新数组元素中包含的数字。因此,在此缩放操作之后,对于此示例,新数组将包含以下值:

1 2 3 4 5 6 7 8 9 10 11 12 13

我的问题:是否有任何标准的 C/C++ 函数/库/代码可用于执行具有不同数组大小和因子的此类操作?这听起来对我来说可能是一个标准问题,人们不必再次重新发明***。

谢谢!

【问题讨论】:

得到一个适合原始数组的线段(y=m*x + c),然后用它得到变换后数组a[i] = (i/L, m * i/L + c)的值 我不知道这样的“标准功能”,但请注意您的问题存在一些问题。缩放后的数组有 13 个元素,但文本显示 12 个元素。 @4386427 数组也被缩放了 4 倍,而不是 3 倍。每个元素都被 4 个元素替换(最后一个元素除外)。 @Elmi 这就是您正在寻找的功能。没有插入数字的标准函数,您必须自己编写代码或找到一些库。 我没有回答任何问题,只是发布了 cmets。您的问题的答案似乎只是“不,没有这样的功能”。 【参考方案1】:

在C++20中,有std::lerp做线性插值。

但是你必须在调整数组大小后手动调用它。比如:

std::vector<int> grow(const std::vector<int>& v, std::size_t k)

    if (v.empty()) 
        return ;   
    

    std::vector<int> res(v.size() * (k - 1) + 1);

    for (std::size_t i = 0; i + 1 < v.size(); ++i) 
        for (std::size_t j = 0; j != k; ++j) 
            res[i * k + j] = std::lerp(v[i], v[i + 1], float(j) / k);
        
    
    res.back() = v.back();
    return res;

Demo

【讨论】:

【参考方案2】:

C++ 标准库目前不包含此类功能。有一个 proposal 来添加线性代数支持,但我看不到那里与插值有关,无论如何,这可能需要几年时间才能产生任何结果。

根据您想要执行的插值类型,您可以查看 eigen 和 boost。

【讨论】:

【参考方案3】:

你想如何处理“第一个值之前”和“最后一个值之后”?有3种可能:

a) 压制他们。在这种情况下,1, 4 按 3 倍缩放将变为 1, 2, 3, 4

b) 假设数据环绕。在这种情况下,1, 4 按 3 倍缩放将变为 2, 1, 2, 3, 4, 3

c) 假设“之前”和“之后”是一个默认值,例如零。在这种情况下,1, 4 按 3 倍缩放将变为 0.66, 1, 2, 3, 4, 2.66

您想如何处理舍入?例如(对于整数),1, 2 缩放 2 倍(使用上面的“a)”)将是 1, 1.5, 2,但 1.5 不是整数,并且与 12。这里有 5 种可能性(舍入到负无穷、舍入到零、从零舍入、舍入到偶数、舍入到正无穷)。

现在...

假设有 4 种整数数据类型(8 位、16 位、32 位和 64 位)和 3 种浮点数据类型(32 位、64 位和 80 位),因此有是“7*3*5= 105”数据类型、缩放方法和舍入的可能排列。

您想在 C 标准库中添加 105 个不同的函数来涵盖所有这些排列吗?

如果你这样做了;那么如何缩放二维数组,缩放“结构/位域数组”,以及......?当然,这些东西都更经常需要。

在缩放原始数字的二维数组成为当前甚至不支持非常基本的库中的“下一个最不希望的”功能之前,需要将多少百万个很少需要的函数添加到标准库中东西(比如beep(frequency))?

【讨论】:

以上是关于缩放和插入数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何移动和缩放图像[关闭]

报表打开慢,图片缩放不了

如何在Android中对图像应用缩放、拖动和旋转[关闭]

高质量图像缩放库[关闭]

如何关闭win10ie浏览器的双指缩放功能

关闭 UIScrollView 的滚动,但保持缩放功能