【问题标题】:Returning vector of smaller length to an already populated Vector将较小长度的向量返回到已填充的向量
【发布时间】:2017-11-29 02:14:18
【问题描述】:

我有一个填充了 x 个值的向量,但我需要使用初始向量多次迭代函数,但每次返回一个可能更少值的向量。这是我目前要做的,目前向量保留所有值,我不确定如何覆盖初始向量声明或有效地从该初始向量中删除项目。

for (auto& image : images)
    {
        rValues.push_back(image->pixels[pix].r);
        gValues.push_back(image->pixels[pix].g);
        bValues.push_back(image->pixels[pix].b);
    }
    for (int i = 0; i < 5; i++)
    {
        float rMedian = calculateMedian(rValues);
        float rsD = calculateStandardDeviation(rValues);
        rValues = sigmaClip(rValues, rsD, rMedian);


        for (auto& r : rValues)
        {
            std::cout << "r val : " << r << "\n";
        }
        system("pause");
    }

(忽略 rValues 的 std::cout,使用它来检查每次迭代是否删除了值)。

这就是我在 sigmaClip 函数中实现的,它需要返回不同长度的向量。

std::vector<float> sigmaClip(std::vector<float> values, float sD, float median)
{
    //Sigma Clip
    float upperBound = median + sD;
    float lowerBound = median - sD;
    std::vector<float> returnVals;
    for (auto& val : values)
    {
        if ((val > lowerBound) && (val < upperBound))
            returnVals.push_back(val);
    }

    return returnVals;
}

我最初尝试在传递给sigmaClip() 的向量上使用 .erase() 和 remove_if 但我认为这些函数没有按我的预期工作,因此在sigmaClip() 中创建另一个向量并返回它希望它会覆盖初始 rValues 向量。

【问题讨论】:

  • 如果目标是改变传递给sigmaClipvector,使其成为参考参数,std::remove_if 应该可以正常工作,无需创建新的vector ,因此无需不断替换现有的。

标签: c++ vector return


【解决方案1】:

std::remove_if 如果与erase 方法配合使用以实现the erase-remove idiom,则应该可以很好地完成工作。重新定义 sigmaClip 以接受对 values 的可变引用(而不是返回它),例如:

void sigmaClip(std::vector<float>& values, float sD, float median)
{
    //Sigma Clip
    const float upperBound = median + sD;
    const float lowerBound = median - sD;
    values.erase(std::remove_if(std::begin(values), std::end(values),
                                [=](float val) { return val < lowerBound || val > upperBound; }),
                 std::end(values));
}

应该可以正常工作,将调用站点更改为:

// Remove assignment back to rValues
sigmaClip(rValues, rsD, rMedian);

【讨论】:

  • 嗨,我尝试实现您上面的建议,但 cout 似乎仍然打印所有值。不确定您是否了解 sigma 裁剪。但我试图通过初始向量迭代多次删除异常值,并在 x 次迭代后从剩余值中取平均值。我认为你的建议与我正在努力完成的事情是正确的。
  • 这与我声明 rValues 向量的方式有关吗? std::vector&lt;float&gt; rValues; std::vector&lt;float&gt; gValues; std::vector&lt;float&gt; bValues;
  • @publicMan:你注意到sigmaClip原型的变化了吗?它现在通过可变引用 (std::vector&lt;float&gt;&amp;) 接受 vector,而不是通过值 (std::vector&lt;float&gt;&amp;)。如果按值接受,移除只会影响sigmaClip中的副本,不会影响调用者副本;通过引用接受意味着您可以就地编辑调用者的vector
  • 是的,我已将 sigmaClip 更改为接受 &amp;values。但它似乎仍然没有从向量中删除值。抱歉不理解,我是 C++ 新手,整个通过引用等传递。
  • 在不同的地方打印一些输出,好像 remove_if 没有做任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 2011-05-15
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多