如何在C ++中将一组整数转换为3D矢量?

时间:2017-06-27 01:03:30

标签: c++ arrays matrix vector set

我在data[12][51]数组中有一个数据矩阵,它是一个12乘51的矩阵。

如果我有set<set<int>> rows,例如,

{(1,2,5),(3,7,8),(9,11)}表示数据矩阵的行索引。

我希望在给定行集索引的情况下形成矩阵,因此(1,2,5)的元素将是由数据矩阵的第1行,第2行和第5行组成的3乘51矩阵。

vector<double> features[12];
for (int i = 0; i < 12; i++){
    for (int j = 0; j < 51; j++){
        features[i].push_back(data[i][j]);
    }
}   

因此,在上一节中,features[i]将返回数据矩阵的整个i行。给定一个任意大小的set<set<int>> rows

vector<vector<vector<double>>> sets;
for (auto & it : rows){
    vector<vector<double>> temp;
    for (int i : it){
        temp.push_back(features[i]);
    }
    sets.push_back(temp);
}

但是当我尝试打印这样的矩阵向量时,通过,

for (int i = 0; i < sets.size(); i++){
    for (int j = 0; j < sets[0].size(); j++){
        for (int z = 0; z < sets[0][0].size(); z++){
            cout << sets[i][j][z] << " , ";
        }
        cout << endl;
    }
    cout << " === Matrix === " << endl;
}

可执行文件冻结然后停止。

因此,如果上述方法不起作用,那么如何将一组整数转换为3D矢量?

2 个答案:

答案 0 :(得分:0)

在一个工具箱中拥有一个现成的,通用的动态大小矩阵总是很好......当你不必在一个库中链接时它就更好了,并且可以随时在任何项目中弹出它。我相信那里有成千上万的人。

根据需要添加配料,并将整洁的文件保存在安全的地方。

您可以添加的内容:获取子矩阵,添加等等。

#include <vector>
#include <algorithm>

template <typename T>
class Matrix
{
private:
  typedef std::vector<std::vector<T>> _Mat;

  _Mat matrix_;

public:
  Matrix(int rows, int cols)
  {
     matrix_.resize(rows);
     for (auto& v : matrix_)
     {
       v.resize(cols);
     } 
  }

  Matrix(int rows, int cols, const T* data)
  {
     matrix_.resize(rows);
     for (auto& v : matrix_)
     {
       v = std::vector<T>(data, data + cols);
       data += cols;
     } 
  }

  size_t rowCount() const  
  { 
    return matrix_.size(); 
  }

  size_t colCount() const  
  { 
    return (rowCount()) ? matrix_[0].size() : 0; 
  }

  const std::vector<T>& getRow(int n) const
  {
    return matrix_.at(n);
  }

  void setRow(int row, const std::vector<T>& v)
  {
    if (row >= rowCount() || v.size() != colCount())
    {
      throw std::exception(); // choose your favorite exception class
    }
    matrix_.at(row) = v;
  }

  std::vector<T> getCol(int col)
  {
    std::vector<T> result;
    std::for_each(matrix_.begin(), matrix_.end(), 
      [&](std::vector<T>& r)
      {
        result.push_back(r.at(col));
      });
    return result;
  }

  void setCol(size_t col, const std::vector<T>& v)
  {
    if (col >= colCount() || v.size() != rowCount())
    {
      throw std::exception(); // choose your favorite exception class
    }
    for (size_t i = 0; i < matrix_.size(); ++i)
    {
      matrix_[i][col] = v[i];
    }
  }

  std::vector<T>& operator[](size_t row) 
  { 
    return matrix_.at(row); 
  }

  const std::vector<T>& operator[](size_t row) const 
  { 
    return matrix_.at(row);
  }
};


int main()
{

   Matrix<double> a(12, 51);
   Matrix<double> b(3, 51);
   Matrix<double> c(12, 2);

   b.setRow(0, a.getRow(1));
   b.setRow(1, a.getRow(25));
   b.setRow(2, a.getRow(12));

   Matrix<double> c(12, 2);
   c.setCol(0, a.getRow(3));
   c.setCol(1, a.getCol(4));  // <<  throws!!

   std::vector<Matrix<double>> matrices;
   matrices.push_back(a);
   matrices.push_back(b);
   matrices.push_back(c);

   Matrix<std::vector<double>> matrixOfVectors;

   return 0;
}

答案 1 :(得分:-3)

为什么不使用这样的风格:

int nMatrix[rowSize][volumnSize][deepSize] = { 0 };

实际上,我们通常使用数组来操作3D数据