按特定顺序遍历 NxN 矩阵的上三角形

Iterate through upper triangle of NxN matrix in specific order

本文关键字:三角形 NxN 定顺序 遍历      更新时间:2023-10-16

我有NxN的零矩阵。我想将存储在 std::vector 中的数据写入此矩阵的右上角三角形(包括对角线(。我的问题是我需要按特定顺序将数据写入其中:让我的源数据向量data,我们正在写入的矩阵是mtr,其大小例如为 5x5。

所以data[0]应该写到mtr[0][4](右上角顶点(。

data[1] - mtr[0][3] ; data[2] - mtr[1][4](三角形的第二"行"(。

data[3] - mtr[0][2] ; data[4] - mtr[1][3] ; data[5] - mtr[2][4](三角形的第三"行"(。等等。正如您从示例中看到的 - 我需要逐行按顺序将数据写入此三角形。

我只是想不出合适的循环。

怎么样:

int data_index = 0;
for (int diagonal = N-1; diagonal >= 0; --diagonal) {
    for (int i = 0; i + diagonal < N; ++i) {
        mtr[i][i+diagonal] = data[data_index];
        ++data_index;
    }
}

只需确保diagonal是有符号的(在本例中int(,或者使用其补码来N-1并将递减更改为递增。

或者,您可以使用类似的想法为矩阵创建迭代器。下面是一个粗略的示例(正确的迭代器会更完整,因此更复杂(:

template<int N>
class Matrix<N>::DiagonalIterator {
    Matrix<N>& m;
    int row;
    int column;
public:
    using difference_type = int;
    using value_type = int;
    using pointer = int*;
    using reference = int&;
    using iterator_category = std::input_iterator_tag;
    DiagonalIterator(Matrix<N>& m, int row, int column)
    : m(m), row(row), column(column) {
    }
    auto operator*() -> int& {
        return m.inner[row*N + column];
    }
    auto operator++() -> Matrix<N>::DiagonalIterator& {
        if (row == N-1) {
            row = N-column;
            column = 0;
        } else if (column == N-1) {
            column = N-2-row;
            row = 0;
        } else {
            ++row;
            ++column;
        }
        return *this;
    }
};

住在科里鲁