我有零个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]
; 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;
}
};
Live on Coliru