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

Posted

技术标签:

【中文标题】如何在 C++ 中将一组整数转换为 3D 向量?【英文标题】:How can I turn a set of set of integers into 3D vectors in C++? 【发布时间】:2017-06-27 01:03:30 【问题描述】:

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

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

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

我想在给定这些行索引集的情况下形成矩阵,因此 (1,2,5) 的元素将是由数据矩阵的第 1 行、第 2 行和第 5 行组成的 3 x 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&lt;set&lt;int&gt;&gt; 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 向量呢?

【问题讨论】:

欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。 @πάνταῥεῖ 这个问题有什么问题?我觉得很好。 @Clonkex 是否提供minimal reproducible example 可以用来重现所描述的行为? sets[0].size(); 应该是 sets[i].size();sets[0][0].size() 应该是 sets[i][j].size() @πάνταῥεῖ 不,但是如果您确切地说出问题的问题而不是仅仅暗示 something 是错误的,这可能会更有帮助。 OP 不会自动知道问题出了什么问题。另外,SO 问题不提供 MCVE 是很常见的,而且它们不是必需的,仅推荐使用。有时无法提供 MCVE,但这仍然是一个好问题。并不是说你本身错了,只是说提一下 OP 应该改变什么会有所帮助。 【参考方案1】:

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

根据需要添加浇头,并将装饰完整的文件保存在安全的地方。

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

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

【讨论】:

【参考方案2】:

为什么不使用这样的样式:

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

其实我们一般都是用数组来操作3D数据

【讨论】:

这应该是个注释,而“其实我们一般都是用数组来操作3D数据的”不,标准c++中是没有的。 感谢您重新编辑我的答案。这里很新,所以使用起来有点奇怪。而且Cpp技能有点弱。因为我在 C++ 开发的 VTK 中使用了 vtkMatrix4x4 类,它使用这样的矩阵......我将检查标准 C++ 如何处理这种数据。再次衷心感谢。

以上是关于如何在 C++ 中将一组整数转换为 3D 向量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SWIG 中将向量的锯齿状 C++ 向量转换(类型映射)为 Python

如何在 C++ 中将 uint8_t 的向量转换为 std::string?

如何在 C++ 中将大数字符串转换为整数?

如何在 C++ 中将字符串数组转换为整数数组?

如何在 C++ 中将数字转换为字符串,反之亦然

如何在R中将两个变量(整数)转换为双精度?