【问题标题】:Inserting multiple elements into a 2D block将多个元素插入 2D 块
【发布时间】:2013-09-23 10:36:34
【问题描述】:

我正在尝试计算向量向量内的一系列元素的能量。一旦特定元素具有正确的能量,它就会被推入另一个向量向量。这里是一个例子,因为它很难解释:

bool energy(const std::vector<double> &vals)
{
  float sum = 0.0;
  for(unsigned i=0; (i < vals.size()); i++)
  {
     sum += (vals[i]*vals[i]);
  }
  //cout << sum << endl;
  return (sum >= 5);
}

int main(int argc, char *argv[]) {

 std::vector<vector<double> > vals {

    {0, 0, 0, 0, 0}, // This has an energy of "0" -> does not count
    {1, 1, 1, 1, 1}, // This has an energy of "5" -> push_back to vector[0]
    {1, 1, 1, 1, 1}, // This has an energy of "5" -> push_back to vector[0]
    {1, 1, 1, 1, 1}, // This has an energy of "5" -> push_back to vector[0]
    {1, 2, 1, 1, 1}, //This has an energy of "5" -> push_back to vector[0]
    {0, 0, 0, 0, 0}, // This has an energy of "0" -> does not count && start a new 
                                // vector
    {1, 2, 3, 4, 5}, // This has an energy of "55" -> push_back to vector[1]
    {1, 2, 3, 4, 5}, // This has an energy of "55" -> push_back to vector[1]
    {1, 2, 3, 4, 5}, // This has an energy of "55" -> push_back to vector[1]
    {1, 2, 3, 4, 5} // This has an energy of "55" -> push_back to vector[1]
};
std::vector<vector<double> > clusters; 
std::vector<vector<double> > tmp;

//std::for_each(vals.begin(), vals.end(), energy);

int j = 0;

for(unsigned i=0; (i < vals.size()); i++)
{
    if(energy(vals[i]))
    {
        clusters.resize(j + 1);
        clusters[j] = vals[i];
    }else if(!energy(vals[i]) && energy(vals[i+1]))
    {
        j++;
    }
}

for(unsigned i=0; (i < clusters.size()); i++)
{
    for(unsigned j=0; (j < clusters[i].size()); j++)
    {
        cout << clusters[i][j] << ' ';
    }
    cout << endl;
}
 }

会发生什么

命名为clusters的向量的向量中应该有2元素,每个元素都包含以下值:

clusters[0] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1 };

`clusters[1] = 1, 2, 3, 4, 5, 
      1, 2, 3, 4, 5,
      1, 2, 3, 4, 5, 
      1, 2, 3, 4, 5}`

发生了什么?

向量的向量似乎覆盖了插入其中的块。所以不是上面的,我只是得到它找到的最后一个元素:

`cluster[0] = {1 2 1 1 1}
cluster[1] = {1 2 3 4 5}`

我的想法和尝试是将每个“块”存储在包含足够能量的向量向量中,然后将所有这些值推入vector&lt;double&gt;,然后将此向量插入集群块中。 .

是否有替代方法,更简单的解决此问题的方法?

【问题讨论】:

  • {1, 2, 1, 1, 1}, //这个能量为“8”
  • @cpp 抱歉,我稍微更改了值以确保我是正确的,它只是存储块的最后一个元素。它仍应存储 {0, 0, .....} 和 {0, 0, ....} 之间的每个元素有什么建议吗?
  • 调用resize,然后将新空间设置为所需的向量是不必要的。只需拨打clusters.push_back(vals[i]),它正在做同样的事情。您的问题似乎暗示您想将所有低能量向量合并为一个向量(对于高能量向量也是如此)。对吗?
  • @ZacHowland 是的,将所有高能向量合并为一个。然后将它们推入当前位置的clusters 向量中。这有意义吗?我不知道该采取什么方法

标签: c++ c++11 vector


【解决方案1】:

更正的代码:

#include<vector>
#include<iostream>
using namespace std;

bool energy(const std::vector<double> &vals)
{
  float sum = 0.0;
  for(unsigned i=0; (i < vals.size()); i++)
  {
     sum += (vals[i]*vals[i]);
  }
  //cout << sum << endl;
  return (sum >= 5);
}

int main(int argc, char *argv[]) {

 std::vector<vector<double> > vals {

    {0, 0, 0, 0, 0}, // This has an energy of "0" -> does not count
    {1, 1, 1, 1, 1}, // This has an energy of "5" -> push_back to vector[0]
    {1, 1, 1, 1, 1}, // This has an energy of "5" -> push_back to vector[0]
    {1, 1, 1, 1, 1}, // This has an energy of "5" -> push_back to vector[0]
    {1, 2, 1, 1, 1}, //This has an energy of "5" -> push_back to vector[0]
    {0, 0, 0, 0, 0}, // This has an energy of "0" -> does not count && start a new
                                // vector
    {1, 2, 3, 4, 5}, // This has an energy of "55" -> push_back to vector[1]
    {1, 2, 3, 4, 5}, // This has an energy of "55" -> push_back to vector[1]
    {1, 2, 3, 4, 5}, // This has an energy of "55" -> push_back to vector[1]
    {1, 2, 3, 4, 5} // This has an energy of "55" -> push_back to vector[1]
};
std::vector<vector<double> > tmp(vals.size());
std::vector<vector<double> > clusters(vals.size());

int j = 0;

for(unsigned i=0; (i < vals.size()); i++)
{
    if(energy(vals[i]))
    {
        clusters[j].insert(clusters[j].end(), vals[i].begin(), vals[i].end());
    }else if(!energy(vals[i]) && energy(vals[i+1]))
    {
        j++;
    }
}

for(unsigned i=0; (i < clusters.size()); i++)
{
    for(unsigned j=0; (j < clusters[i].size()); j++)
    {
        cout << clusters[i][j] << ' ';
    }
    cout << endl;
}
 }

输出是:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 

【讨论】:

  • 谢谢你。但是,这并没有合并所有的高频值。例如:for(unsigned i=0; (i &lt; clusters[1].size()); i++) { cout &lt;&lt; clusters[1][i]; } 必须显示整个向量,而不仅仅是一行。如果这有意义吗? IE。 clusters.size(); 应该只有 2,因为只有 2 对高频值..
  • @user1326876,我已经确定了答案。
  • 老兄,你是个传奇 :) 非常感谢!没想到这么简单,谢谢!我只需要解决尺寸问题,然后我就完成了! TY
【解决方案2】:

你的问题在这里:

for(unsigned i=0; (i < vals.size()); i++)
{
    if(energy(vals[i]))
    {
        clusters.resize(j + 1);
        clusters[j] = vals[i];
    }
    else if(!energy(vals[i]) && energy(vals[i+1]))
    {
        j++;
    }
}

首先,你的energy函数返回一个int,所以当返回值非零时,它会将条件评估为true,当它为0时,它将是false .

其次,您实际上是在if 分支中执行push_back,但您只是推送当前向量(您没有将其附加到现有向量)。

要解决此问题,我建议使用map&lt;int, vector&lt;int&gt;&gt;,以便您可以快速引用每个集群(例如,能量为 5 的集群的键为 5,因此您可以创建一个新向量并插入这些值,或附加到那里已经存在的那个)。如果您需要在向量的向量中使用它,您可以在对它们进行排序后迭代地图并将它们交换到向量的向量中。

【讨论】:

  • 谢谢扎克!!使用std::map&lt;int, vector&lt;int&gt;&gt; 可以让我将所有集群合并在一起吗?因为,这是我对这个问题的总体结果。
  • 不是直接的,但是是的。它将允许您快速访问相同能级的向量。合并是通过使用insert 函数或使用std::copy(vals[i].begin(), vals[i].end(), std::back_inserter(myMap[myEnergy])); 完成的
【解决方案3】:

你可以简化很多你的代码,所以它会更容易阅读和理解,例如你的能量函数,你可以使用算法将它写在一行中:

return std::inner_product(vals.begin(), vals.end(), vals.begin(), 0.) >= 5;

【讨论】:

    【解决方案4】:

    我改了一段代码让它工作

      int j = 0;
    
      for(unsigned i=0; (i < vals.size()); i++)
      {
          if(energy(vals[i])) {
              clusters[j].insert(clusters[j].end, vals[i].begin(), vals[i].end());
          }
          if(!energy(vals[i]) && energy(vals[i+1])) {
            clusters.push_back( tmp );
            ++j;
          }
    
      }
    

    不要使用调整大小。您可以将一个空向量 push_back 到您的集群中。

    并且对于每个附加一个向量的操作,只需使用按范围插入

    void insert (iterator position, InputIterator first, InputIterator last);
    

    参考:http://en.cppreference.com/w/cpp/container/vector/insert

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多