【问题标题】:Averageif function equivalent for C++等效于 C++ 的 Averageif 函数
【发布时间】:2016-05-05 19:13:51
【问题描述】:

我是编码的初学者,我正在尝试缩小一大段容易出错的代码。我非常想要它

if (tileBlocked[row - 1][col] == true)
{ 
    add tileAir[row - 1][col] to averaging
}

只有当 tileBlocked 没有将该区域列为阻塞时,我才会在数组 tileAir 中找到值的平均值。我四处搜索,唯一找到的是Averageif,据我所知,它仅适用于excel。是否有任何等效或某种方式可以减小这段代码的大小并提供更好的扩展能力?

现在这是我当前的代码:

for (int row = 1; row < 255; ++row) // Repeats for all rows, skipping the first and final row
    {

        for (int col = 1; col < 255; ++col) // Repeats for all columns, skipping the first and final column
        {

            bool check[4] = { tilesBlocked[row - 1][col], tilesBlocked[row][col - 1], tilesBlocked[row][col + 1], tilesBlocked[row + 1][col] }; // Creates an Array for testing what tiles should be ommited from the calculation

            if (tilesBlocked[row][col][0] == true) // If the tile being calculated is blocked, skip it
            {
            }
            else if (check[0] == true && check[1] == true && check[2] == true && check[3] == true)
            {
            }
            else if (check[0] == false && check[1] == false && check[2] == false && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col - 1] + tilesOxygen[row][col + 1] + tilesOxygen[row + 1][col]) / 5);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == false && check[2] == false && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col - 1] + tilesOxygen[row][col + 1]) / 4);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == false && check[2] == true && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col - 1] + tilesOxygen[row + 1][col]) / 4);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == false && check[2] == true && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col - 1]) / 3);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == true && check[2] == false && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col + 1] + tilesOxygen[row + 1][col]) / 4);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == true && check[2] == false && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row][col + 1]) / 3);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == true && check[2] == true && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col] + tilesOxygen[row + 1][col]) / 3);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == false && check[1] == true && check[2] == true && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row - 1][col]) / 2);
                tilesOxygen[row - 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == false && check[2] == false && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col - 1] + tilesOxygen[row][col + 1] + tilesOxygen[row + 1][col]) / 4);
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == false && check[2] == false && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col - 1] + tilesOxygen[row][col + 1]) / 3);
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == false && check[2] == true && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col - 1] + tilesOxygen[row + 1][col]) / 3);
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == false && check[2] == true && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col - 1]) / 2);
                tilesOxygen[row][col - 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == true && check[2] == false && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col + 1] + tilesOxygen[row + 1][col]) / 3);
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == true && check[2] == false && check[3] == true)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row][col + 1]) / 2);
                tilesOxygen[row][col + 1] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else if (check[0] == true && check[1] == true && check[2] == true && check[3] == false)
            {
                tilesOxygen[row][col] = ((tilesOxygen[row][col] + tilesOxygen[row + 1][col]) / 2);
                tilesOxygen[row + 1][col] = tilesOxygen[row][col];
                tilesOxygen[0][col] = 0;
                tilesOxygen[row][0] = 0;
                tilesOxygen[255][col] = 0;
                tilesOxygen[row][255] = 0;
            }
            else
            {
                std::cout << "Something Broke";
            }
        } 
    }

如您所见,这是高度不可扩展且容易出错的。在这个具体的例子中,tileAir 被替换为 tileOxygen。

【问题讨论】:

  • 在代码重复的情况下使用 c++ 中的函数。在这种情况下,错误被固定在一个特定的函数而不是整个代码上。
  • 我不认为它可以编译。 tilesBlocked[row - 1][col]好像是个bool,那怎么第三次解引用:tilesBlocked[row][col][0]
  • @RishitSanmukhani 这将如何与 parallel_for 一起工作(在兼容性方面)。实际上,每种空气都有 6 种不同的螺纹。另外,关于我应该如何设置该功能的任何想法?
  • 对于并行化检查 openmp。
  • @seleciii44 啊,就是这样,因为我实际上正在更改整个脚本以使用更大的 4 维数组 tileAir。前两个维度是世界位置,第三个维度是空气类型,第四个维度是温度。 tileBlocked 将成为一个 3 维数组,其中前两个是位置,第三个是温度(如果温度为 0 时为真,则压力不会流动,而如果为 1 时为真,则温度不会流动。如果两者都是真的没有流。所以不,我不希望这个片段编译。

标签: c++ arrays if-statement average


【解决方案1】:

至少,对于任何布尔表达式foofoo==true 可以只替换为foo,而foo==false 可以替换为!foo.

【讨论】:

  • 谢谢!我将在重写中使用它。
【解决方案2】:

似乎没有等效于 C++ excel 中的 Averageif。但是通过使用函数减少了出错的可能性并增加了可读性。

【讨论】:

    【解决方案3】:

    如果我理解了你的意图和你的代码,你的循环可以这样转换:

    // Repeats for all rows, skipping the first and final row
    for (int row = 1; row < 255; ++row) 
    {
        // Repeats for all columns, skipping the first and final column
        for (int col = 1; col < 255; ++col) 
        {
            // If the tile being calculated is blocked, skip it
            if ( tilesBlocked[row][col]
                || ( tilesBlocked[row - 1][col] && tilesBlocked[row][col - 1]
                && tilesBlocked[row][col + 1] && tilesBlocked[row + 1][col] )) 
            {
                continue;
            }
            double avg = tilesOxygen[row][col];    // educated guess about the type
            int count = 1;
            if ( !tilesBlocked[row + 1][col] ) {
                avg += tilesOxygen[row + 1][col];
                ++count;
            }
            if ( !tilesBlocked[row][col + 1] ) {
                avg += tilesOxygen[row][col + 1];
                ++count;
            }
            if ( !tilesBlocked[row][col - 1] ) {
                avg += tilesOxygen[row][col - 1];
                ++count;
            }
            if ( !tilesBlocked[row - 1][col] ) {
                avg += tilesOxygen[row - 1][col];
                ++count;
            }
            avg /= count;
            tilesOxygen[row][col] = avg;
            if ( !tilesBlocked[row + 1][col] ) {
                tilesOxygen[row + 1][col] = avg;
            }
            if ( !tilesBlocked[row][col + 1] ) {
                tilesOxygen[row][col + 1] = avg;
            }
            if ( !tilesBlocked[row][col - 1] ) {
                tilesOxygen[row][col - 1] = avg;
            }
            if ( !tilesBlocked[row - 1][col] ) {
                tilesOxygen[row - 1][col] = avg;
            }
            tilesOxygen[0][col] = 0;
            tilesOxygen[row][0] = 0;
            tilesOxygen[255][col] = 0;
            tilesOxygen[row][255] = 0;
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2019-03-29
      相关资源
      最近更新 更多