复制矩阵选择不复制的行

Copy Matrix selecting which rows not to copy

本文关键字:复制 选择      更新时间:2023-10-16

我试图找出这一点时有问题: 我的矩阵为12x12,例如,我想创建一个10x10的新矩阵,它是第一个的确切副本,但选择了哪个两个列不复制。有可能做到这一点吗?我真的无法弄清楚

不幸的是,我需要说,有4200万个可能的解决方案: - (

通常我会使用std ::算法解决问题。

,但是,首先,我将使用许多循环来复制数据。

由于您没有告知矩阵元素的类型,因此我将矩阵创建为模板。无论您想要什么尺寸。此外,我添加了一个设施,以便能够指定不应复制的行/柱的变量列表。

代码是评论,相当简单的。然而。如果您有疑问,那么我很乐意回答。

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