缩放和插入数组[关闭]
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
不是整数,并且与 1
和2
。这里有 5 种可能性(舍入到负无穷、舍入到零、从零舍入、舍入到偶数、舍入到正无穷)。
现在...
假设有 4 种整数数据类型(8 位、16 位、32 位和 64 位)和 3 种浮点数据类型(32 位、64 位和 80 位),因此有是“7*3*5= 105
”数据类型、缩放方法和舍入的可能排列。
您想在 C 标准库中添加 105 个不同的函数来涵盖所有这些排列吗?
如果你这样做了;那么如何缩放二维数组,缩放“结构/位域数组”,以及......?当然,这些东西都更经常需要。
在缩放原始数字的二维数组成为当前甚至不支持非常基本的库中的“下一个最不希望的”功能之前,需要将多少百万个很少需要的函数添加到标准库中东西(比如beep(frequency)
)?
【讨论】:
以上是关于缩放和插入数组[关闭]的主要内容,如果未能解决你的问题,请参考以下文章