将Vector的数据扩展到指定大小(插值)

时间:2019-07-19 04:55:00

标签: c++

我需要一个函数,该函数接受向量并将其增大到新的大小,使用插值法(线性很好)来填补数据的空白。

function(vector<double> &vect, int newSize); //something like this

在某些情况下这很容易做到,但通常很麻烦。

简单:

vector<int> vect{ 0, 2, 4 };
newSize = 5;
function(vector<double> &vect, int newSize); //=> {0, 1, 2, 3, 4}

硬:

vector<int> vect{ 0, 2, 4 };
newSize = 6;
function(vector<double> &vect, int newSize); //=> ??????????????

在更困难的情况下,我什至不知道仅凭插值就可以解决这个问题,而且不确定是否有一些标准约定可以像这样扩展样本数据。

任何信息或建议都值得赞赏。

1 个答案:

答案 0 :(得分:0)

我会尝试类似的方法:

std::vector<double> interpolate(const std::vector<double>& v, const unsigned newSize)
{
  assert(!v.empty());
  std::vector<double> result(newSize);
  const std::size_t oldSize = v.size();
  for (unsigned i=0; i < newSize; i++)
  {
    const unsigned idx = i*(oldSize-1) / newSize;
    const unsigned mod = i*(oldSize-1) % newSize;

    if (mod == 0)
      result[i] = v[idx];
    else
    {
      const double part = double(mod) / double(newSize);
      result[i] = v[idx]*(1.0-part) + v[idx+1]*part;
    }
  }
  return result;
}