我在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矢量?
答案 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数据