按特定顺序遍历 NxN 矩阵的上三角形
Iterate through upper triangle of NxN matrix in specific order
我有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;
}
};
住在科里鲁
相关文章:
- 绘制旋转的三角形
- 如何用for循环在c++中生成单词三角形
- 如何使用递归打印修改后的星号三角形图案
- C++ 创建带有 for 循环的三角形
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Eigen c++ 三角形来自
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 使用对象文件读取三角形数据网格
- 从捕获的帧中裁剪三角形 - OpenCV 和 C++
- 如何从 3D 曲面网格中删除自相交三角形?
- 以C++输出一个数字三角形
- 打印对立三角形在C++中起作用
- 确定C++中的等腰直角三角形
- 是否可以使用 DirectX 3D 11 绘制由三角形组成的圆?
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- OpenGL绘制三角形而不是正方形
- 将数字表示为两个三角形数字的总和
- OpenGL程序不显示三角形
- 按特定顺序遍历 NxN 矩阵的上三角形