尝试解决此问题时遇到问题: 我有一个12x12的矩阵,例如,我想创建一个10x10的新矩阵,它是第一个矩阵的精确副本,但选择不复制哪两列。有没有办法做到这一点?我真的无法弄清楚
答案 0 :(得分:0)
不幸的是,我不得不说,大约有4200万种可能的解决方案:-)
通常我会使用std :: algorithms解决问题。
但是,首先,我将使用许多for循环来复制数据。
因为您没有告知矩阵元素的类型,所以我将矩阵创建为模板。无论您想要什么尺寸。另外,我添加了一种功能,可以指定不应复制的行/列的可变列表。
该代码已注释并且相当简单。然而。如果您有任何疑问,我很乐意回答。
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
// Matrix as vector of vectors
template <class T>
struct Matrix
{
Matrix(size_t size) { matrix.resize(size); std::for_each(matrix.begin(), matrix.end(), [size](Columns & c) {c.resize(size); }); }
Matrix() {}
Matrix copyAndShrink(std::vector<size_t>& vectorsToOmit);
// A vetcor has Columns
using Columns = std::vector<T>;
// ANd rows. And that will be the matrix
std::vector<Columns> matrix{};
};
template <class T>
Matrix<T> Matrix<T>::copyAndShrink(std::vector<size_t>& vectorsToOmit)
{
// Define resulting new destination Matrix
Matrix<T> reducedMatrix{};
// Iterate over all rows
for (size_t row=0; row< matrix.size(); ++row) {
// If we shall not copy, then ignore this row
if (vectorsToOmit.end() != std::find(vectorsToOmit.begin(),vectorsToOmit.end(), row )) continue;
// Create a new empty row in the destination matrix
reducedMatrix.matrix.push_back(Columns());
// Now we wan to copy the columns
for (size_t column=0; column< matrix.size(); ++column) {
// But only, if this columns shall be copied
if (vectorsToOmit.end() != std::find(vectorsToOmit.begin(),vectorsToOmit.end(), column )) continue;
// Copy
reducedMatrix.matrix.rbegin()->push_back(matrix[row][column]);
}
}
return reducedMatrix;
}
constexpr size_t OriginalMatrixSize{12};
int main()
{
// Define the source
Matrix<int> m(OriginalMatrixSize);
// fill the Matrix with some test data
int fillCounter{0};
for (size_t rows=0;rows<OriginalMatrixSize;++rows)
for (size_t columns=0;columns<OriginalMatrixSize;++columns)
m.matrix[rows][columns] = fillCounter++;
// Define the rows and columns that we do not want to copy
std::vector<size_t> vectorsToOmit{2UL,4UL};
// Copy the source matrix to a reduced destination
Matrix<int> reducedMatrix{m.copyAndShrink(vectorsToOmit)};
// Show result. Print complete matrix
for (size_t rows=0;rows<OriginalMatrixSize-vectorsToOmit.size();++rows) {
for (size_t columns=0;columns<OriginalMatrixSize-vectorsToOmit.size();++columns) {
std::cout << reducedMatrix.matrix[rows][columns] << ' ';
}
std::cout << '\n';
}
return 0;
}