Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inserting multiple elements into a 2D block

Tags:

c++

c++11

vector

I am attempting to calculate the energy of a series of elements inside a vector of vectors. As soon as the particular element has the right energy, it is then pushed into another vector of vectors. Here is an example because it is hard to explain:

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;
}
 }

What should happen

There should be 2 elements of the vector of vectors named clusters each containing the values of:

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}`

What is happening?

The vector of vectors seem to be over-riding the blocks that get inserted into them. So instead of the above, I just get the last element that it found so:

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

What I was thinking and attempting was to store each of the "blocks" inside a vector of vectors that contain the sufficient energy and then push all these values inside a vector<double> and then insert this vector inside the block of clusters..

Is there an alternative way, a much simpler solution to this problem?

like image 295
Phorce Avatar asked Jun 30 '26 15:06

Phorce


1 Answers

Corrected code:

#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;
}
 }

The output is:

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 
like image 66
cpp Avatar answered Jul 03 '26 05:07

cpp