以特定顺序迭代NxN矩阵的上三角形

时间:2018-03-17 22:49:55

标签: c++ algorithm matrix

我有零的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](第三个"行"三角形)。等等。正如您从示例中看到的那样 - 我需要逐行顺序地将数据写入此三角形。

我无法想到合适的循环。

1 个答案:

答案 0 :(得分:3)

怎么样:

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

Live on Coliru