gpt4 book ai didi

c++ - 按特定顺序迭代 NxN 矩阵的上三角

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:28:53 26 4
gpt4 key购买 nike

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

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

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

data[3] - mtr[0][2] ; 数据[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;
}
};

Live on Coliru

关于c++ - 按特定顺序迭代 NxN 矩阵的上三角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49342692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com