如何在 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<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 向量呢?
【问题讨论】:
欢迎来到 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