复制矩阵选择不复制的行

时间:2019-06-26 01:35:04

标签: c++

尝试解决此问题时遇到问题:  我有一个12x12的矩阵,例如,我想创建一个10x10的新矩阵,它是第一个矩阵的精确副本,但选择不复制哪两列。有没有办法做到这一点?我真的无法弄清楚

1 个答案:

答案 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;
}