【问题标题】:Iterate through upper triangle of NxN matrix in specific order以特定顺序遍历 NxN 矩阵的上三角
【发布时间】:2018-08-26 19:35:37
【问题描述】:

我有 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](三角形的第三“行”)。等等。从示例中可以看出 - 我需要逐行按顺序将数据写入这个三角形。

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

【问题讨论】:

  • 要解决一个问题,必须把它描述清楚(除非你靠运气),你的问题描述得不够清楚,你才能解决它,更不用说让别人去解决它了能够帮助你。投票结束,因为不清楚。
  • @Peter 究竟有什么不清楚的地方?我认为描述非常清晰易懂。我应该在描述中添加什么以便您更好地理解它?

标签: c++ algorithm matrix


【解决方案1】:

怎么样:

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

【讨论】:

  • 感谢您的建议。它几乎完全适合我。但我应该补充一点,在第二个 for 循环中,我们还需要检查 data_index &lt; data.size()。因为如果我们不这样做,每次我们无法用数据完全填充三角形行之一时,我们都会在 data[data_index] 中收到out of range 错误。
  • 如果data 不一定包含足够的元素,那么当然需要检查上限。阅读您的问题,我认为data 的元素数量与矩阵三角形中的元素数量完全相同。我添加了一个迭代器的示例,这对于您的情况可能过于复杂,但带来了标准算法的优势(特别是std::copy)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多